Javascript 无法通过nodejs中的fs.readFile()读取整个文件

Javascript 无法通过nodejs中的fs.readFile()读取整个文件,javascript,node.js,csv,Javascript,Node.js,Csv,我正在尝试读取和处理以下文件 名称:“TechCrunchcontinentalUSA.csv” 大小:92KB 该文件共有1461行数据 该文件位于当前工作文件夹中,从以下链接下载 链接: 我的代码如下: const fs = require('fs') function test(fileName = 'TechCrunchcontinentalUSA.csv'){ return new Promise((resolve, reject)=>{ fs.re

我正在尝试读取和处理以下文件

  • 名称:“TechCrunchcontinentalUSA.csv”
  • 大小:92KB
  • 该文件共有1461行数据
  • 该文件位于当前工作文件夹中,从以下链接下载
  • 链接:
我的代码如下:

const fs = require('fs')

function test(fileName = 'TechCrunchcontinentalUSA.csv'){
    return new Promise((resolve, reject)=>{
        fs.readFile(fileName, 'utf-8', (err, data)=>{
            if (err) reject(err.message)
            resolve(data)
        })
    })
}

async function temp(){
    let data = await test()
    console.log(data)
}

temp()
international-liars-poker-association,International Liars Poker Association,24,other,St. Louis,MO,1-Nov-07,1250000,USD,s
grid-networks,Grid Networks,,web,Seattle,WA,20-May-08,10500000,USD,bd00,USD,a,bD,b0,USD,seedaD,a
输出只有两行(垃圾数据也是如此),如下所示:

const fs = require('fs')

function test(fileName = 'TechCrunchcontinentalUSA.csv'){
    return new Promise((resolve, reject)=>{
        fs.readFile(fileName, 'utf-8', (err, data)=>{
            if (err) reject(err.message)
            resolve(data)
        })
    })
}

async function temp(){
    let data = await test()
    console.log(data)
}

temp()
international-liars-poker-association,International Liars Poker Association,24,other,St. Louis,MO,1-Nov-07,1250000,USD,s
grid-networks,Grid Networks,,web,Seattle,WA,20-May-08,10500000,USD,bd00,USD,a,bD,b0,USD,seedaD,a
我不明白怎么了。上面的代码是读取这样的文件的正确方法吗?或者是
还有其他更好的方法可以完全读取这样的文件吗?请引导我。

没有什么不对的。您只是将一个文件作为缓冲区读取,并期望它充当一个行数组

如果对文件运行
hextump
,您将看到换行符都是回车(
'\r'
或0x0d)。没有换行符。转储文件时,每个回车符都会导致在第一列重新启动输出,而不会创建新行

0000000 6570 6d72 6c61 6e69 2c6b 6f63 706d 6e61
0000010 2c79 756e 456d 706d 2c73 6163 6574 6f67
0000020 7972 632c 7469 2c79 7473 7461 2c65 7566
0000030 646e 6465 6144 6574 722c 6961 6573 4164
0000040 746d 722c 6961 6573 4364 7275 6572 636e
0000050 2c79 6f72 6e75 0d64 696c 6566 6f6c 6b63
                       ^^ carriage return
0000060 4c2c 6669 4c65 636f 2c6b 772c 6265 542c
当我在Linux上对文件进行cat时,所有文件都打印在一行上。您可能看到两行,因为其中一行足够长,可以在终端中触发自动换行。(其他证据:事实上,“国际说谎者扑克协会”这一行是文件中最长的一行。)

如果使用
'\r'
作为分隔符将缓冲区拆分为行,然后分别打印所有行,则应获得预期的输出

async function temp(){
    let data = await test()
    let lines = data.split('\r')
    lines.forEach(line => console.log(line))
}

没什么不对的。您只是将一个文件作为缓冲区读取,并期望它充当一个行数组

如果对文件运行
hextump
,您将看到换行符都是回车(
'\r'
或0x0d)。没有换行符。转储文件时,每个回车符都会导致在第一列重新启动输出,而不会创建新行

0000000 6570 6d72 6c61 6e69 2c6b 6f63 706d 6e61
0000010 2c79 756e 456d 706d 2c73 6163 6574 6f67
0000020 7972 632c 7469 2c79 7473 7461 2c65 7566
0000030 646e 6465 6144 6574 722c 6961 6573 4164
0000040 746d 722c 6961 6573 4364 7275 6572 636e
0000050 2c79 6f72 6e75 0d64 696c 6566 6f6c 6b63
                       ^^ carriage return
0000060 4c2c 6669 4c65 636f 2c6b 772c 6265 542c
当我在Linux上对文件进行cat时,所有文件都打印在一行上。您可能看到两行,因为其中一行足够长,可以在终端中触发自动换行。(其他证据:事实上,“国际说谎者扑克协会”这一行是文件中最长的一行。)

如果使用
'\r'
作为分隔符将缓冲区拆分为行,然后分别打印所有行,则应获得预期的输出

async function temp(){
    let data = await test()
    let lines = data.split('\r')
    lines.forEach(line => console.log(line))
}

起初,您的代码没有问题,在我的本地计算机上也不起作用:

我的第一个假设是:文件有问题

我创建了一个git存储库并将CSV添加到其中。我用编辑器打开并保存了该文件,该编辑器将基于Windows的文本更改为Unix

在那之后,它起了作用:


首先,您的代码没有问题,在我的本地计算机上也不起作用:

我的第一个假设是:文件有问题

我创建了一个git存储库并将CSV添加到其中。我用编辑器打开并保存了该文件,该编辑器将基于Windows的文本更改为Unix

在那之后,它起了作用:


您能告诉我如何使用'\r'将缓冲区拆分为行吗?只需使用
data.split('\r')
。这非常好用。您能指导我如何使用'\r'将缓冲区拆分为行吗?只需使用
data.split('\r')
。这非常有效