如何在 NodeJS 中解析 CSV 文件

Chi*_*ron 5 javascript csv parsing node.js

我有一个Task.csv包含以下内容的文件:

task1,01/05/2020, 20/05/2020, Active
task2,03/05/2020, 17/05/2020, Active
task3,10/05/2020, 25/05/2020, Active
task4,02/05/2020, 21/05/2020, Active
task5,07/05/2020, 28/05/2020, Active
Run Code Online (Sandbox Code Playgroud)

我想在 JavaScript (NodeJS) 中解析它并显示用括号括起来的每一行。以下是我正在使用的代码:

function readCsvFile()
{
    var fs = require('fs');
    var textByLine = fs.readFileSync('Tasks.csv').toString().split("\n");   
    var i;<br>

    for (i=0; i<textByLine.length; i++)
    {
        console.log("[" + textByLine[i] + "]");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的期望:

[task1,01/05/2020, 20/05/2020, Active]
[task2,03/05/2020, 17/05/2020, Active]
[task3,10/05/2020, 25/05/2020, Active]
[task4,02/05/2020, 21/05/2020, Active]
[task5,07/05/2020, 28/05/2020, Active]
Run Code Online (Sandbox Code Playgroud)

当我运行它时,输出是:

]task1,01/05/2020, 20/05/2020, Active
]task2,03/05/2020, 17/05/2020, Active
]task3,10/05/2020, 25/05/2020, Active
]task4,02/05/2020, 21/05/2020, Active
[task5,07/05/2020, 28/05/2020, Active]
Run Code Online (Sandbox Code Playgroud)

我是 JavaScript 和 NodeJS 新手,所以任何评论都会有帮助,谢谢。

San*_*tel 5

不要同步读取文件。如果您正在读取大文件,您可以使用内置模块readline逐行读取文件并处理每一行,而不必担心 CLRF。或者使用fast-csv这样的模块有很多功能。

快速 csv

const fs = require('fs');
const path = require('path');
const csv = require('fast-csv');

fs.createReadStream('Tasks.csv')
    .pipe(csv.parse({ headers: true }))
    .on('error', error => console.error(error))
    .on('data', row => console.log(row))
    .on('end', rowCount => console.log(`Parsed ${rowCount} rows`));
Run Code Online (Sandbox Code Playgroud)

阅读线

   const readline = require('readline');
    const fs = require('fs');
    
    cost lineReader = readline.createInterface({
      input: fs.createReadStream('Tasks.csv')
    });
    
    let lineno = 0;
    lineReader.on('line', function (line) {
         lineno++
       // process line here
       // let colValues=  line.split(",") 
    });
  
   lineReader.on('close', () => {
    console.log('Done reading file');
   });
Run Code Online (Sandbox Code Playgroud)

使用for await循环更好的语法

for await (let line of lineReader) {
       console.log(line);
      }
 
Run Code Online (Sandbox Code Playgroud)


Say*_*V R 0

请尝试这样

function readCsvFile()
{
    var fs = require("fs");
    var textByLine = fs.readFileSync("Tasks.csv").toString().split("\n");
    console.log(textByLine);
    const res = textByLine.map((line) => line.split(","));
    console.log(res)
}

output

[["task1","01/05/2020"," 20/05/2020"," Active\r"],
 ["task2","03/05/2020"," 17/05/2020"," Active\r"],
 ["task3","10/05/2020"," 25/05/2020"," Active\r"],
 ["task4","02/05/2020"," 21/05/2020"," Active\r"],
 ["task5","07/05/2020"," 28/05/2020"," Active"]]
Run Code Online (Sandbox Code Playgroud)