csv 如何在Node JS上使用papaparse?

np8igboo  于 2023-05-26  发布在  其他
关注(0)|答案(4)|浏览(264)

我一直试图让papaparsenodejs上运行很长一段时间了,我一直失败。我想尝试加载我的本地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
41ik7eoe

41ik7eoe1#

从Papaparse README中,它以这种方式支持Node:
Papa Parse在Node.js环境中使用时可以解析Readable Stream而不是File(除了普通字符串)。在此模式下,encoding必须是Node支持的字符编码(如果指定)。Papa.LocalChunkSizePapa.RemoteChunkSizedownloadwithCredentialsworker配置选项不可用。
Papa Parse还可以解析节点流风格,这使得.pipe可用。只需将ReadableStream通过管道传输到从Papa.parse(Papa.NODE_STREAM_INPUT, options)返回的流。Papa.LocalChunkSizePapa.RemoteChunkSizedownloadwithCredentialsworkerstepcomplete配置选项不可用。要在流中注册回调来处理数据,请使用'data'事件,如下所示:stream.on('data', callback)并发出流结束的信号,使用'end'事件如下:stream.on('end', callback) .

pexxcrt2

pexxcrt22#

正如Erick在评论中所说,Node不支持下载选项。但是,它确实告诉我们Node接口接受ReadableStream而不是File
这对我很有效:

Papa.parse(fs.createReadStream("sample/result.csv"), {
    complete: function(results) {
        console.log(results["data"]);
    }
});
euoag5mw

euoag5mw3#

你的代码很好,问题出在文件路径上。fs.createReadStream需要一个绝对路径,或者一个相对于项目根的路径。
假设这是项目结构:

files/
  - test.csv
src/
  - convert-csv.ts
package.json
tsconfig.json

然后,您可以使用相对于根的路径:'./files/test.csv',或者如果你真的想使用一个相对于文件的路径,那么你可以使用path.resolve(__dirname, '..', 'files', 'test.csv')
path.resolve参见NodeJS文档,它将使用路径段为您解析绝对路径。

prdp8dxp

prdp8dxp4#

在使用papa-parse时遇到了这个问题,文档不是很清楚。来源:Toshino's answer

import Papa from 'papaparse';
import { Readable } from 'stream';

export const parseCsvFromReadable = async (
  readable: Readable,
): Promise<Papa.ParseResult<unknown>> => {
  return new Promise((resolve, reject) => {
    Papa.parse(readable, {
      complete: results => {
        if (results.errors.length > 0) {
          reject(new Error(JSON.stringify(results.errors)));
        }
        resolve(results);
      },
      error: error => reject(error),
      header: true,
    });
  });
};

相关问题