如何在Node JS上使用papaparse?

问题描述

很长一段时间以来,我一直试图让papaparsenodejs上运行,但我一直失败。我想尝试加载本地CSV,然后提供此papaparse吗?怎么做?我的代码不起作用。

import papa from "papaparse";
import fs from "fs";

export const convertCSV = async (res: Response) => {
  const file = await fs.createReadStream("../files/test.csv");
  papa.parse(file,{
    header: true,complete: function (results,file) {
      console.log("Complete",results.data.length,"records.");
    },});
};

results.data.length始终是0

我的CSV文件位于files文件夹中,该文件夹位于src文件夹中:

src/files/test.csv

解决方法

您可以仅使用papaparser进行流式传输,而无需使用单独的fs流式传输

let filePath= '../files/test.csv';
Papa.parse(filePath,{
    download: true,step: function(row) {
        console.log("Row:",row.data);
    },complete: function(results) {
        console.log("All done!");
        console.log('Complete ',results.data.length,' records.');
    }
});
,

Papaparse README开始,它通过以下方式支持Node:

在Node.js环境中使用(除了纯字符串之外),Papa Parse可以解析Readable Stream而不是File。在这种模式下,from xml.dom import minidom # read the xml xml_path = r"C:\Users\vblagoje\test_python_s2k\Load_Independent_Results\HSB53111-01-D_2008_v2-Final-Test-Cases_All_1.1.xml" mydoc=minidom.parse(xml_path) root = mydoc.getElementsByTagName("FEST2000") detail_assembly_map = {} # fill the dictionary for node in root: for childNodes in node.childNodes: if childNodes.nodeType == childNodes.TEXT_NODE: continue if childNodes.nodeName == "ASSEMBLY": assembly = childNodes.getAttribute("NAME") if childNodes.nodeName == "DETAIL": detail_assembly_map[childNodes.getAttribute("NAME")] = assembly # use it aDetail = "myDetail" assembly = detail_assembly_map[aDetail] 必须是受节点支持的字符编码(如果已指定)。 encodingPapa.LocalChunkSizePapa.RemoteChunkSizedownloadwithCredentials配置选项不可用。

Papa Parse还可以以节点流式样式进行解析,从而使worker可用。只需将Readable Stream用管道传输到.pipe返回的流。 Papa.parse(Papa.NODE_STREAM_INPUT,options)Papa.LocalChunkSizePapa.RemoteChunkSizedownloadwithCredentialsworkerstep配置选项不可用。要在流中注册回调以处理数据,请使用complete事件,例如:'data',并通过以下方式使用stream.on('data',callback)事件来指示流的结束,例如:{{1} }。

,

您的代码很好,问题出在文件路径中。 fs.createReadStream需要绝对路径,或相对于项目根目录的路径。

假设这是项目结构:

files/
  - test.csv
src/
  - convert-csv.ts
package.json
tsconfig.json

然后,您可以使用相对于根目录的路径:'./files/test.csv', 或者如果您确实要使用相对于文件的路径,则可以使用path.resolve(__dirname,'..','files','test.csv')

请参见NodeJS docs for path.resolve,它将使用路径段为您解析绝对路径。

,

正如埃里克在他们的评论中所说,the download option is not supported by Node。但是,它确实告诉我们 Node 接口接受 ReadableStream 而不是 File

这对我有用:

Papa.parse(fs.createReadStream("sample/result.csv"),{
    complete: function(results) {
        console.log(results["data"]);
    }
});