好像你需要使用一些基于流的解决方案,已经存在这样的库,所以在重新发明自己之前,尝试这个库,其中还包括验证支持。 https://www.npmjs.org/package/fast-csv
我当前的解决方案使用异步模块来串行执行:
var fs = require('fs'); var parse = require('csv-parse'); var async = require('async'); var inputFile='myfile.csv'; var parser = parse({delimiter: ','}, function (err, data) { async.eachSeries(data, function (line, callback) { // do something with the line doSomething(line).then(function() { // when processing finishes invoke the callback to move to the next one callback(); }); }) }); fs.createReadStream(inputFile).pipe(parser);
csv-parser
csv-parse
首先安装csv-parser:
npm install csv-parser
所以假设你有一个像这样的csv文件:
NAME, AGE Lionel Messi, 31 Andres Iniesta, 34
您可以执行以下所需的操作:
const fs = require('fs'); const csv = require('csv-parser'); fs.createReadStream(inputFilePath) .pipe(csv()) .on('data', function(data){ try { console.log("Name is: "+data.NAME); console.log("Age is: "+data.AGE); //perform the operation } catch(err) { //error handler } }) .on('end',function(){ //some final operation });
进一步阅读 参考
npm安装csv
示例CSV文件 你需要一个CSV文件来解析,所以要么你已经有一个,或者你可以复制下面的文本并将其粘贴到一个新文件中并调用该文件“mycsv.csv”
ABC, 123, Fudge 532, CWE, ICECREAM 8023, POOP, DOGS 441, CHEESE, CARMEL 221, ABC, HOUSE 1 ABC, 123, Fudge 2 532, CWE, ICECREAM 3 8023, POOP, DOGS 4 441, CHEESE, CARMEL 5 221, ABC, HOUSE
示例代码读取和解析CSV文件
创建一个新文件,并将以下代码插入其中。务必仔细阅读幕后发生的事情。
var csv = require('csv'); // loads the csv module referenced above. var obj = csv(); // gets the csv module to access the required functionality function MyCSV(Fone, Ftwo, Fthree) { this.FieldOne = Fone; this.FieldTwo = Ftwo; this.FieldThree = Fthree; }; // Define the MyCSV object with parameterized constructor, this will be used for storing the data read from the csv into an array of MyCSV. You will need to define each field as shown above. var MyData = []; // MyData array will contain the data from the CSV file and it will be sent to the clients request over HTTP. obj.from.path('../THEPATHINYOURPROJECT/TOTHE/csv_FILE_YOU_WANT_TO_LOAD.csv').to.array(function (data) { for (var index = 0; index < data.length; index++) { MyData.push(new MyCSV(data[index][0], data[index][1], data[index][2])); } console.log(MyData); }); //Reads the CSV file from the path you specify, and the data is stored in the array we specified using callback function. This function iterates through an array and each line from the CSV file will be pushed as a record to another array called MyData , and logs the data into the console to ensure it worked. var http = require('http'); //Load the http module. var server = http.createServer(function (req, resp) { resp.writeHead(200, { 'content-type': 'application/json' }); resp.end(JSON.stringify(MyData)); }); // Create a webserver with a request listener callback. This will write the response header with the content type as json, and end the response by sending the MyData array in JSON format. server.listen(8080); // Tells the webserver to listen on port 8080(obviously this may be whatever port you want.) 1 var csv = require('csv'); 2 // loads the csv module referenced above. 3 鈥媆n4 var obj = csv(); 5 // gets the csv module to access the required functionality 6 鈥媆n7 function MyCSV(Fone, Ftwo, Fthree) { 8 this.FieldOne = Fone; 9 this.FieldTwo = Ftwo; 10 this.FieldThree = Fthree; 11 }; 12 // Define the MyCSV object with parameterized constructor, this will be used for storing the data read from the csv into an array of MyCSV. You will need to define each field as shown above. 13 鈥媆n14 var MyData = []; 15 // MyData array will contain the data from the CSV file and it will be sent to the clients request over HTTP. 16 鈥媆n17 obj.from.path('../THEPATHINYOURPROJECT/TOTHE/csv_FILE_YOU_WANT_TO_LOAD.csv').to.array(function (data) { 18 for (var index = 0; index < data.length; index++) { 19 MyData.push(new MyCSV(data[index][0], data[index][1], data[index][2])); 20 } 21 console.log(MyData); 22 }); 23 //Reads the CSV file from the path you specify, and the data is stored in the array we specified using callback function. This function iterates through an array and each line from the CSV file will be pushed as a record to another array called MyData , and logs the data into the console to ensure it worked. 24 鈥媆n25 var http = require('http'); 26 //Load the http module. 27 鈥媆n28 var server = http.createServer(function (req, resp) { 29 resp.writeHead(200, { 'content-type': 'application/json' }); 30 resp.end(JSON.stringify(MyData)); 31 }); 32 // Create a webserver with a request listener callback. This will write the response header with the content type as json, and end the response by sending the MyData array in JSON format. 33 鈥媆n34 server.listen(8080); 35 // Tells the webserver to listen on port 8080(obviously this may be whatever port you want.) Things to be aware of in your app.js code In lines 7 through 11, we define the function called 'MyCSV' and the field names. If your CSV file has multiple columns make sure you define this correctly to match your file. On line 17 we define the location of the CSV file of which we are loading. Make sure you use the correct path here.
启动您的应用程序并验证功能 打开控制台并键入以下命令:
节点应用 1 节点应用 您应该在控制台中看到以下输出:
[ MYCSV { Fieldone: 'ABC', Fieldtwo: '123', Fieldthree: 'Fudge' }, MYCSV { Fieldone: '532', Fieldtwo: 'CWE', Fieldthree: 'ICECREAM' }, MYCSV { Fieldone: '8023', Fieldtwo: 'POOP', Fieldthree: 'DOGS' }, MYCSV { Fieldone: '441', Fieldtwo: 'CHEESE', Fieldthree: 'CARMEL' }, MYCSV { Fieldone: '221', Fieldtwo: 'ABC', Fieldthree: 'HOUSE' }, ]
1 [MYCSV {Fieldone:'ABC',Fieldtwo:'123',Fieldthree:'Fudge'}, 2 MYCSV {Fieldone:'532',Fieldtwo:'CWE',Fieldthree:'ICECREAM'}, 3 MYCSV {Fieldone:'8023',Fieldtwo:'POOP',Fieldthree:'DOGS'}, 4 MYCSV {Fieldone:'441',Fieldtwo:'CHEESE',Fieldthree:'CARMEL'}, 五 MYCSV {Fieldone:'221',Fieldtwo:'ABC',Fieldthree:'HOUSE'},] 现在您应该打开Web浏览器并导航到您的服务器。您应该看到它以JSON格式输出数据。
结论 使用node.js及其CSV模块,我们可以快速,轻松地读取和使用存储在服务器上的数据,并根据请求将其提供给客户端
我用这种方式: -
var fs = require('fs'); var parse = require('csv-parse'); var csvData=[]; fs.createReadStream(req.file.path) .pipe(parse({delimiter: ':'})) .on('data', function(csvrow) { console.log(csvrow); //do something with csvrow csvData.push(csvrow); }) .on('end',function() { //do something wiht csvData console.log(csvData); });
您正在引用的node-csv项目完全足以完成转换大部分CSV数据的每一行的任务,来自以下文档: http://csv.adaltas.com/transform/ :
csv() .from('82,Preisner,Zbigniew\n94,Gainsbourg,Serge') .to(console.log) .transform(function(row, index, callback){ process.nextTick(function(){ callback(null, row.reverse()); }); });
根据我的经验,我可以说它也是一个相当快速的实现,我一直在处理具有接近10k记录的数据集,并且整个集合的处理时间在合理的几十毫秒级别。
Rearding jurka 基于流的解决方案建议:node-csv是基于流的,并遵循Node.js的流API。
该 快速CSV npm模块可以从csv文件逐行读取数据。
这是一个例子:
let csv= require('fast-csv'); var stream = fs.createReadStream("my.csv"); csv .fromStream(stream, {headers : true}) .on("data", function(data){ console.log('I am one line of data', data); }) .on("end", function(){ console.log("done"); });
为了暂停流媒体 快速CSV 你可以做到以下几点:
let csvstream = csv.fromPath(filePath, { headers: true }) .on("data", function (row) { csvstream.pause(); // do some heavy work // when done resume the stream csvstream.resume(); }) .on("end", function () { console.log("We are done!") }) .on("error", function (error) { console.log(error) });
尝试逐行npm插件。
npm install line-by-line --save
您可以使用csv-to-json模块将csv转换为json格式,然后您可以在程序中轻松使用json文件
fs = require('fs'); fs.readFile('FILENAME WITH PATH','utf8', function(err,content){ if(err){ console.log('error occured ' +JSON.stringify(err)); } console.log('Fileconetent are ' + JSON.stringify(content)); })
我需要一个异步csv阅读器,最初尝试@Pransh Tiwari的答案,但无法使用它 await 和 util.promisify() 。最终我遇到了 节点csvtojson ,它几乎和csv-parser一样,但是有了promises。以下是csvtojson的示例用法:
await
util.promisify()
const csvToJson = require('csvtojson'); const processRecipients = async () => { const recipients = await csvToJson({ trim:true }).fromFile('./recipients.csv'); // Code executes after recipients are fully loaded. recipients.forEach((recipient) => { console.log(recipient.name, recipient.email); }); };