Как разобрать файл CSV в NodeJS - PullRequest
2 голосов
/ 18 апреля 2020

У меня есть файл 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

Я хочу разобрать это в 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] + "]");
    }
}

Что я ожидаю:

[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]

Когда я его запускаю, вывод:

]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]

Я новичок в JavaScript и NodeJS, поэтому любой комментарий будет полезен, спасибо.

Ответы [ 5 ]

2 голосов
/ 18 апреля 2020

Не читать файл синхронно. Вы можете использовать встроенный модуль readline для построчного чтения файла и обработки каждой строки, где вам не нужно беспокоиться о CLRF. В качестве альтернативы можно использовать такой модуль, как fast-csv , имеющий множество функций.

fast-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`));

Readline

   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');
   });
0 голосов
/ 19 апреля 2020

Спасибо всем за отзывы! Это решило мою проблему. Сначала я попробовал предложение @PatrickEvans, и оно сработало! По сути, я должен использовать «\ r \ n», чтобы разбить файл на отдельные строки, поскольку я создал файл CSV в Windows.

Так что теперь это рабочий код

function readCsvFile()
{

    var fs = require('fs');
    var textByLine = fs.readFileSync('Tasks.csv').toString().split("\r\n"); 
    var i;

    for (i=0; i<textByLine.length; i++)
    {
        console.log("[" + textByLine[i] + "]");
    }
}
0 голосов
/ 18 апреля 2020

Сколько бы проблем не было c при импорте node.js модулей для тривиальных целей, при разборе файлов CSV есть достаточно граничных случаев и ошибок, которые нужно сделать лучше, но хорошо проверенных. Лучший результат на NPM таков: https://www.npmjs.com/package/csv-parser

Использование модуля также сократит количество ненужного кода и agile кода, который вам придется поддерживать самостоятельно.

Вот ссылка на RF C для CSV-файлов, которая является наиболее близкой мне известной к стандарту для них: https://tools.ietf.org/html/rfc4180 Надеюсь, это даст вам достаточно информации о В крайних случаях, о которых я упомянул, я ценю необходимость использовать модуль.

0 голосов
/ 18 апреля 2020

Чтобы исправить ваш код, просто используйте метод .split () из Javascript, чтобы получить результат в нужном формате. Я сделал небольшое изменение в вашем коде и получил ответ так, как вы упомянули.

function readCsvFile() {
    var fs = require('fs');
    var textByLine = fs.readFileSync('data.csv').toString().split("\n");
    var i;
    for (i = 0; i < textByLine.length-1; i++) {
        console.log(textByLine[i].split("\t"))
    }
}
0 голосов
/ 18 апреля 2020

Пожалуйста, попробуйте вот так

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"]]
...