问题描述
很长一段时间以来,我一直试图让papaparse
在nodejs
上运行,但我一直失败。我想尝试加载本地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]
必须是受节点支持的字符编码(如果已指定)。encoding
,Papa.LocalChunkSize
,Papa.RemoteChunkSize
,download
和withCredentials
配置选项不可用。
,Papa Parse还可以以节点流式样式进行解析,从而使
worker
可用。只需将Readable Stream用管道传输到.pipe
返回的流。Papa.parse(Papa.NODE_STREAM_INPUT,options)
,Papa.LocalChunkSize
,Papa.RemoteChunkSize
,download
,withCredentials
,worker
和step
配置选项不可用。要在流中注册回调以处理数据,请使用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"]);
}
});