如何处理在线CSV文件,如使用Node JS "http://.../data.csv?para1=...¶2=..."



我最近尝试使用node js从雅虎财经等其他网站收集一些数据,其中一个网址像这个"http://real-chart.finance.yahoo.com/table.csv?s=AAPL&a=11&b=12&c=1999&d=01&e=4&f=2016&g=d&ignore=.csv",如果我把这个网址放到浏览器中,会提示一个弹出窗口。在我的节点代码中,找不到此 URL。

var fs = require('fs');
var http = require('http');
var url = require('url');
var csv = require( "fast-csv" );
// var FILENAME = "file/table.csv";
var FILENAME = "http://real-chart.finance.yahoo.com/table.csv?s=AAPL&a=11&b=12&c=1999&d=01&e=4&f=2016&g=d&ignore=.csv";
function fast_csv_read(filename)
{
    csv.fromPath(filename)
    .on("data", function(data){
        console.log("current data: ");
        console.log(data);
    })
    .on("end", function(){
        console.log("done reading");
    });
}
fast_csv_read(FILENAME);

如果我使用浏览器下载此文件并将其保存在"文件/表.csv"中,它可以正常工作。不知道出了什么问题...

.fromPath只接受文件路径,不接受URL

必须先自己从 URL 中检索文档,然后通过以下方式之一将其内容提供给 fast-csv 模块:

  • 将文档内容传递给.fromString()
  • 将可读流传递给.fromStream()
  • 通过管道将可读流传送到.parse()

request模块提供了一种从 URL 返回可读流的便捷方法;使用 npm --save install request 进行安装。

例如,将可读流传递给.fromStream()如下所示:

#!/usr/bin/env node
var csv = require( "fast-csv" );
// Require the 'request' module.
// Install it with `npm install --save request`.
var request = require('request');
var URL = "http://real-chart.finance.yahoo.com/table.csv?s=AAPL&a=11&b=12&c=1999&d=01&e=4&f=2016&g=d&ignore=.csv";
function fast_csv_read_url(url)
{
    // Let request return the document pointed to by the URL
    // as a readable stream, and pass it to csv.fromStream()
    csv.fromStream(request(url))
      .on("data", function(data){
        console.log("current data: ");
        console.log(data);
      })
      .on("end", function(){
        console.log("done reading");
      });
}
fast_csv_read_url(URL);

@mklement0给出的答案似乎简单而伟大,但不幸的是request模块已被弃用。由于got是推荐的替代方法,因此我最终得到了以下代码:

import * as csv from "fast-csv";
import got from "got";
var my_url = "https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2022/2022-01-11/colony.csv"
got.stream(my_url)
    .pipe(csv.parse()) // https://c2fo.github.io/fast-csv/docs/parsing/methods
    .on('error', error => console.error(error))
    .on('data', row => console.log(`ROW=${JSON.stringify(row)}`))
    .on('end', rowCount => console.log(`Parsed ${rowCount} rows`));

在此博客文章中查看有关got的更多信息

最新更新