使用Nodejs/Papa Parse解析远程CSV文件?

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"))
Run Code Online (Sandbox Code Playgroud)

在您自己的示例中,您将文件保存到磁盘,即使使用 PapaParse 也不需要。


Dav*_*iao 11

经过大量修补后,我终于得到了一个使用异步流并且没有其他库(fs/request 除外)的工作示例。它适用于远程和本地文件。

我需要创建一个数据流以及一个 PapaParse 流(papa.NODE_STREAM_INPUT用作 的第一个参数papa.parse()),然后将数据通过管道传输到 PapaParse 流中。需要为PapaParse 流上的datafinish事件实现事件侦听器。然后,您可以在事件处理程序中使用解析后的数据。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);
});

Run Code Online (Sandbox Code Playgroud)

dataparseStream的事件恰好为 CSV 中的每一行运行一次(尽管我不确定这种行为是否得到保证)。希望这可以帮助某人!

要使用本地文件而不是远程文件,您可以执行相同的操作,但dataStream将使用fs以下方法创建:

const dataStream = fs.createReadStream("./myfile.csv");
Run Code Online (Sandbox Code Playgroud)

(您可能希望使用path.join__dirname指定相对于文件所在位置的路径,而不是相对于运行位置的路径)

  • 大卫,如果这有效(还没有尝试过),它应该是接受的答案!干得好,伙计! (2认同)

小智 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;
    }
});
Run Code Online (Sandbox Code Playgroud)