![]() |
文武双全的爆米花 · NodeJS 将 Base64 或 ...· 1 月前 · |
![]() |
眉毛粗的豆浆 · 解决Jenkins中Node和Yarn路径问 ...· 1 月前 · |
![]() |
迷茫的鸵鸟 · Tutorial: Microsoft ...· 8 月前 · |
![]() |
率性的麦片 · EditPlus怎么删除行首空白?EditP ...· 1 年前 · |
![]() |
玩足球的手术刀 · 救命!点云可视化(不需配置PCL) - 知乎· 1 年前 · |
![]() |
鬼畜的大象 · 为容器和 Pod 分配内存资源 | ...· 1 年前 · |
![]() |
唠叨的鸵鸟 · javascript - ...· 1 年前 · |
我目前正在从Node应用程序解析远程csv产品馈送,并希望使用Papa Parse来完成(因为我过去在浏览器中使用它取得了成功)。
Papa Parse Github:
https://github.com/mholt/PapaParse
我最初的尝试和网络搜索并没有确切地发现这是如何做到的。Papa readme说Papa Parse现在与Node兼容,因此Baby Parse (用于提供一些Node解析功能)已经被贬低。
这里有一个文档的Node部分的链接,供将来在这个问题上遇到困难的任何人参考:
https://github.com/mholt/PapaParse#papa-parse-for-node
从文档段落看,Node中的Papa Parse可以解析可读的流,而不是文件。我的问题是;
有没有办法利用可读流功能来使用Papa在Node中下载/解析远程CSV类似于Papa在浏览器中使用XMLHttpRequest来实现相同的目标?
对于未来的可见性
对于那些在该主题上进行搜索(并避免重复类似问题)的人,请尝试使用此处介绍的远程文件解析功能:
http://papaparse.com/docs#remote-files
将在您的控制台中导致以下错误:
“未处理的拒绝ReferenceError:未定义XMLHttpRequest”
我已经在官方存储库上打开了一个问题,并将在了解更多需要解决的问题时更新此问题。
我添加了这个答案(并将随着我的进展更新它),以防其他人还在研究这个问题。
以前的用户似乎都是先下载文件,然后再进行处理。这应该不是必需的,因为Papa Parse应该能够处理读取流,并且应该可以通过管道将'http‘GET发送到该流。
这是一个例子,有人在讨论我正在尝试做什么,然后退回到下载文件,然后解析它:
https://forums.meteor.com/t/processing-large-csvs-in-meteor-js-with-papaparse/32705/4
注意:在上面讨论了Baby Parse,现在Papa Parse与Node Baby Parse一起工作,Baby Parse已经折旧。
下载文件解决方法
虽然下载然后用Papa Parse解析并不能回答我的问题,但这是我目前唯一的变通办法,其他人可能想要使用这种方法。
我下载并解析的代码目前看起来像这样:
// Papa Parse for parsing CSV Files
var Papa = require('papaparse');
// HTTP and FS to enable Papa parse to download remote CSVs via node streams.
var http = require('http');
var fs = require('fs');
var destinationFile = "yourdestination.csv";
var download = function(url, dest, cb) {
var file = fs.createWriteStream(dest);
var request = http.get(url, function(response) {
response.pipe(file);
file.on('finish', function() {
file.close(cb); // close() is async, call cb after close completes.
}).on('error', function(err) { // Handle errors
fs.unlink(dest); // Delete the file async. (But we don't check the result)
if (cb) cb(err.message);
download(feedURL, destinationFile, parseMe);
var parseMe = Papa.parse(destinationFile, {
header: true,
dynamicTyping: true,
step: function(row) {
console.log("Row:", row.data);
complete: function() {
console.log("All done!");
});
好的,我想我有答案了。但我想只有时间能证明这一点。
请注意,我的文件是带有制表符分隔符的.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;
});
实际上,您可以使用
称为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,这也不是必需的。
Http(s)实际上有一个可读的流作为回调中的参数,所以这里有一个简单的解决方案
try {
var streamHttp = await new Promise((resolve, reject) =>
https.get("https://example.com/yourcsv.csv", (res) => {
resolve(res);
} catch (e) {
console.log(e);
Papa.parse(streamHttp, config);
![]() |
迷茫的鸵鸟 · Tutorial: Microsoft Entra single sign-on (SSO) integration with Amazon Managed Grafana - Microsoft E 8 月前 |
![]() |
玩足球的手术刀 · 救命!点云可视化(不需配置PCL) - 知乎 1 年前 |