如何使用 Papa Parse 读取本地文件?

How can I read a local file with Papa Parse?

如何使用 Papa Parse 读取本地文件?我在本地有一个名为 challanges.csv 的文件,但经过多次尝试后我无法使用 Papa Parse 解析它。

var data;

Papa.parse('challanges.csv', {
  header: true,
  dynamicTyping: true,
  complete: function(results) {
    console.log(results);
    data = results.data;
  }
});

据我所知,我在将 csv 文件作为文件打开时遇到了问题。我怎样才能用 javascript 做到这一点?

您需要在配置中再添加一行:download: true,.

var data;

Papa.parse('../challanges.csv', {
  header: true,
  download: true,
  dynamicTyping: true,
  complete: function(results) {
    console.log(results);
    data = results.data;
  }
});

更新:有了这个答案,您就不需要 FILE 对象了。您可以传递文件名,爸爸解析 "download" 它。

papaparse 文档建议的File API 是针对浏览器使用的。假设你在服务器端的节点上 运行 这个,对我有用的是利用 readable stream:

const fs = require('fs');
const papa = require('papaparse');
const file = fs.createReadStream('challenge.csv');
var count = 0; // cache the running count
papa.parse(file, {
    worker: true, // Don't bog down the main thread if its a big file
    step: function(result) {
        // do stuff with result
    },
    complete: function(results, file) {
        console.log('parsing complete read', count, 'records.'); 
    }
});

可能有一个更简单的界面,但到目前为止效果很好,并提供流式处理大文件的选项。

这是为了重申最佳答案是 Murat Seker 的。

所有必要的是将添加到配置 download: true,本地路径将由 Papa Parse 下载。 Philip M. 的流式回答不是最佳答案。

var data;

Papa.parse('challanges.csv', {
  header: true,
  download: true,
  dynamicTyping: true,
  complete: function(results) {
    console.log(results);
    data = results.data;
  }
});

P.S。我没有足够的声誉来评论 Murat Seker 的回答。所以,我重新发布了一个答案。任何对声誉的热爱都会受到赞赏。 :-)

None 其中对我有用,我特别想在 csv 服务器端 中阅读, 不是客户端 (在浏览器中)。这对我有用。

异步/等待

const fs = require('fs');
const Papa = require('papaparse');

const csvFilePath = 'data/test.csv'

// Function to read csv which returns a promise so you can do async / await.

const readCSV = async (filePath) => {
  const csvFile = fs.readFileSync(filePath)
  const csvData = csvFile.toString()  
  return new Promise(resolve => {
    Papa.parse(csvData, {
      header: true,
      complete: results => {
        console.log('Complete', results.data.length, 'records.'); 
        resolve(results.data);
      }
    });
  });
};

const test = async () => {
  let parsedData = await readCSV(csvFilePath); 
}

test()

如果你不想要 promise / async, await 那么你可以使用这个。

回调

const fs = require('fs');
const Papa = require('papaparse');

const csvFilePath = 'data/test.csv'

const file = fs.createReadStream(csvFilePath);

var csvData=[];
Papa.parse(file, {
  header: true,
  step: function(result) {
    csvData.push(result.data)
  },
  complete: function(results, file) {
    console.log('Complete', csvData.length, 'records.'); 
  }
});

注意 header: true 是配置中的一个选项,其他选项请参阅文档

这是我的解决方案: 1: FE: Angular 10、NPM 安装 ngx-papaparse 然后在组件中导入

import { Papa } from "ngx-papaparse";

2: 一个类型文件的输入只接受 FE 上的 csv 文件

 <input type="file" id="csv-file" accept=".csv" (change)="onFileSelected($event)">

3:一键读取CSV文件

4:我们从onFileSelected函数中获取文件数据

    const files = event.target.files;
    if (files.length === 0)
      return;
    this.selectedFile = files[0] as File;

5:调用读取CSV文件功能

  this.papa.parse(this.selectedFile, {
        delimiter: ",",
        newline: "",
        header: true,
        dynamicTyping: true,
        complete: (result) => {
          this.fileData= result.data;
        }
      });

6:你应该得到 object 文件数据 提示:查看 papaparse 文档以查看您需要什么配置。 https://www.papaparse.com/ 例如:header: true --> 表示您将在结果 object

中得到 header