Nec*_*vil 6 csv parsing node.js papaparse
我目前正致力于从Node应用程序解析远程csv产品供稿,并希望使用Papa Parse来做到这一点(因为我过去在浏览器中取得了成功).
Papa Parse Github:https://github.com/mholt/PapaParse
我最初的尝试和网络搜索并没有准确地说明如何做到这一点.Papa自述文件说Papa Parse现在与Node兼容,因此Baby Parse(用于提供一些节点解析功能)已被折旧.
这是一个指向文档节点部分的链接,适用于将来在这个问题上绊倒的人:https://github.com/mholt/PapaParse#papa-parse-for-node
从该doc段开始,看起来Node中的Papa Parse可以解析可读流而不是File.我的问题是;
有没有办法利用可读流功能来使用Papa下载/解析Node中的远程CSV,这与浏览器中的Papa如何使用XMLHttpRequest实现同样的目标有什么相似之处?
对于未来可见性 对于那些搜索该主题(并避免重复类似问题)的人,尝试利用此处描述的远程文件解析功能:http://papaparse.com/docs#remote-files将导致您的以下错误安慰:
"未处理的拒绝ReferenceError:未定义XMLHttpRequest"
我已经在官方存储库上打开了一个问题,并将更新此问题,因为我了解了有关需要解决的问题的更多信息.
Mic*_*cki 11
实际上,您可以使用称为 scramjet的轻量级流转换库- 直接从 http 流解析 CSV 是我的主要示例之一。它还使用PapaParse来解析 CSV。
你上面写的所有内容,中间有任何转换,只需几行即可完成:
const {StringStream} = require("scramjet");
const request = require("request");
request.get("https://srv.example.com/main.csv")   // fetch csv
    .pipe(new StringStream())                       // pass to stream
    .CSVParse()                                   // parse into objects
    .consume(object => console.log("Row:", object))  // do whatever you like with the objects
    .then(() => console.log("all done"))
在您自己的示例中,您将文件保存到磁盘,即使使用 PapaParse 也不需要。
Dav*_*iao 11
经过大量修补后,我终于得到了一个使用异步流并且没有其他库(fs/request 除外)的工作示例。它适用于远程和本地文件。
我需要创建一个数据流以及一个 PapaParse 流(papa.NODE_STREAM_INPUT用作 的第一个参数papa.parse()),然后将数据通过管道传输到 PapaParse 流中。需要为PapaParse 流上的data和finish事件实现事件侦听器。然后,您可以在事件处理程序中使用解析后的数据。finish
请参阅下面的示例:
const papa = require("papaparse");
const request = require("request");
const options = {/* options */};
const dataStream = request.get("https://example.com/myfile.csv");
const parseStream = papa.parse(papa.NODE_STREAM_INPUT, options);
dataStream.pipe(parseStream);
let data = [];
parseStream.on("data", chunk => {
    data.push(chunk);
});
parseStream.on("finish", () => {
    console.log(data);
    console.log(data.length);
});
dataparseStream的事件恰好为 CSV 中的每一行运行一次(尽管我不确定这种行为是否得到保证)。希望这可以帮助某人!
要使用本地文件而不是远程文件,您可以执行相同的操作,但dataStream将使用fs以下方法创建:
const dataStream = fs.createReadStream("./myfile.csv");
(您可能希望使用path.join并__dirname指定相对于文件所在位置的路径,而不是相对于运行位置的路径)
小智 6
好的,所以我想我有一个答案.但我想只有时间会证明. 请注意,我的文件是带有制表符分隔符的.txt.
var fs = require('fs');
var Papa = require('papaparse');
var file = './rawData/myfile.txt';
// When the file is a local file when need to convert to a file Obj.
//  This step may not be necissary when uploading via UI
var content = fs.readFileSync(file, "utf8");
var rows;
Papa.parse(content, {
    header: false,
    delimiter: "\t",
    complete: function(results) {
        //console.log("Finished:", results.data);
    rows = results.data;
    }
});
| 归档时间: | 
 | 
| 查看次数: | 8195 次 | 
| 最近记录: |