如何在 Node JS 上使用 papaparse?

4

我一直尝试在nodejs上运行papaparse,但一直失败。我想尝试加载本地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

我该如何将它读取为字符串? - redlightfilms
5个回答

2

正如Erick在他们的评论中所说,Node不支持下载选项。然而,它告诉我们Node接口接受一个ReadableStream而不是File

这对我来说很有效:

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

2
Papaparse README中可以看出,它支持Node的方式如下:

在Node.js环境中,Papa Parse可以解析可读流而不是文件(除了普通字符串)。在此模式下,如果指定了,则必须使用Node支持的字符编码作为encodingPapa.LocalChunkSizePapa.RemoteChunkSizedownloadwithCredentialsworker配置选项不可用。

Papa Parse还可以以节点流式样式解析,这使得.pipe可用。只需将可读流传输到从Papa.parse(Papa.NODE_STREAM_INPUT, options)返回的流即可。 Papa.LocalChunkSizePapa.RemoteChunkSizedownloadwithCredentialsworkerstepcomplete配置选项不可用。要注册回调函数以处理数据流,请使用'data'事件,例如:stream.on('data', callback)。要发出流结束的信号,请使用'end'事件,例如:stream.on('end', callback)


1
他们没有提到的一个重要注意事项是 - 不要尝试使用@types/papaparse,因为它将引用所有不受node支持的调用的DOM库并破坏您的构建。老派的require完全可以胜任。 - Oly Dungey

1
你的代码没有问题,问题出在文件路径上。fs.createReadStream需要绝对路径或相对于你的项目根目录的路径。
假设这是项目结构:
files/
  - test.csv
src/
  - convert-csv.ts
package.json
tsconfig.json

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

0

在使用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,
    });
  });
};

0
要在Mac上使Node.js的流媒体工作,对我来说这个方法有效:
用法: % node this-file.mjs < csv-file.csv
/* Documentation
   https://www.papaparse.com/docs#config
   https://github.com/mholt/PapaParse/blob/master/README.md#papa-parse-for-node
*/

import Papa from 'papaparse'

Papa.parse(process.stdin, {
  header: true,
  step: function(results) {
    process.stdout.write(`${JSON.stringify(results.data)}\n`)
  },
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接