【问题标题】:How can I read a local file with Papa Parse?如何使用 Papa Parse 读取本地文件?
【发布时间】:2018-09-20 00:42:22
【问题描述】:

如何使用 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 文件作为 File 打开时遇到了问题。我怎么能用 javascript 做到这一点?

【问题讨论】:

  • 'challanges.csv' 替换为通过文件输入或拖放操作获得的文件
  • 谢谢你们,它确实有效,但现在每次刷新浏览器时,我都必须上传文件。没有更简单的方法吗? @无尽
  • 如果您想在刷新后保留文件,那么您需要将文件存储在某个存储层(最好是 indexedDB 存储)中,我可以推荐:localForage

标签: javascript node.js csv papaparse


【解决方案1】:

这是我的解决方案: 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: 你应该得到对象 fileData 提示:查看 papaparse 文档以了解您需要什么配置。 https://www.papaparse.com/ eg: header: true --> 表示您将在结果对象中获取标题

【讨论】:

    【解决方案2】:

    这些都不适合我,我特别想在 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,那么你可以使用它。

    回调

    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 是配置中的一个选项,请参阅文档了解其他选项

    【讨论】:

    • 这真是太棒了。异步/等待是要走的路。
    【解决方案3】:

    这是为了重申最好的答案是 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;
      }
    });
    

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

    【讨论】:

    • 参数download: true 以URL 形式访问文件,因此它不是在本地读取它,而是尝试从网页下载它。 OP 专门询问有关读取本地文件的问题。
    • 这适用于本地文件或网络文件。这是我用来读取本地文件的代码。
    • 正如您在文档 (papaparse.com/docs) 中所读到的,如果您设置了 download: true,将使用路径作为 URL,因此,将尝试下载它(即使它来自 localhost,这不是访问本地文件,而是从本地 Web 服务器下载)
    • 恕我直言,Alex,无论文件怎么说,我提供的解决方案都有效。这正是我们系统中在生产环境中运行的内容。
    • 所提供的解决方案仅在 Web 服务器在本地计算机上运行时才有效。在您的回答中,您没有指定它,并且仅在没有 Web 服务器的情况下执行此代码将不起作用。当然,您也只能从 Web 服务器目录中读取文档,而不能访问本地文件系统。而且答案是专门说要读取本地文件。
    【解决方案4】:

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

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

    更新:有了这个答案,您不需要 FILE OBject。您可以传递文件名,papa parse 将“下载”它。

    【讨论】:

    • 我尝试了你的建议,但得到了...\node_modules\papaparse\papaparse.js:591 ReferenceError: XMLHttpRequest is not defined 错误。我正在使用 Papa Parse v.4.5。
    • @user1330974 看这里:stackoverflow.com/questions/38644080/…
    【解决方案5】:

    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.'); 
        }
    });
    

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

    【讨论】:

    • 这是一个漂亮的包!它对我来说很有效,只需使用 React 在前端加载 csv。
    • @Proghero 您是使用 Philip 回答中的代码来做到这一点的,还是自己推出的?
    • @Casimir 我使用了与上面几乎相同的代码。为什么?你有问题吗?
    • 我还没试过上面的代码。只是 fs 不能在客户端工作,所以我很好奇你是如何将它移植到前端 React 的。
    • 我刚刚传递了你通常在 React 中得到的文件数组对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2018-05-29
    • 2018-04-01
    • 2020-02-06
    相关资源
    最近更新 更多