使用 Papaparse 从 CSV 文件中删除不需要的列

Remove unwanted columns from CSV file using Papaparse

我遇到了用户可以上传 csv 文件的情况。此 CSV 文件包含大量数据,但我只对 2 列(ID 和日期)感兴趣。目前,我正在使用 Papaparse

解析 CSV
Papa.parse(ev.data, {
    delimiter: "",
    newline: "",
    quoteChar: '"',
    header: true,
    error: function(err, file, inputElem, reason) { },
    complete: function (results) {
        this.parsed_csv = results.data;

    }
});

当这是运行时this.parsed_csv表示由字段名称键入的数据对象。所以如果我 JSON.stringify 输出是这样的

[
  {
    "ID": 123456,
    "Date": "2012-01-01",
    "Irrelevant_Column_1": 123,
    "Irrelevant_Column_2": 234,
    "Irrelevant_Column_3": 345,
    "Irrelevant_Column_4": 456
  },
  ...
]

所以我的主要问题是如何删除不需要的列,只生成一个包含列 ID 和日期的新 csv?

谢谢

我意识到一件事,有没有办法添加动态变量。例如,我让用户 select 我想要映射的列。现在我需要做这样的事情

let ID = this.selectedIdCol;
this.parsed_csv = results.data.map(element => ({ID: element.ID, Date: element.Date}));

不过是说ID没用。谢谢

let data = [
  {
    "ID": 123456,
    "Date": "2012-01-01",
    "Irrelevant_Column_1": 123,
    "Irrelevant_Column_2": 234,
    "Irrelevant_Column_3": 345,
    "Irrelevant_Column_4": 456
  },
  ...
]

只需使用以下代码生成结果:

data = data.map(element => ({ID: element.ID, Date: element.Date}))

现在您有了所需的列,请在这些列上生成新的 CSV

请注意,如果您正在加载一个巨大的文件,您将在解析后立即将整个文件保存在内存中。此外,由于工作量大,它可能会冻结浏览器。您可以通过读取和丢弃列来避免这种情况:

  • 逐行
  • 一块一块地。

您应该在实施之前阅读 Papaparse's FAQ。总而言之,您将通过从 stepchunk 回调中提取所需的列来存储它们。

正如上面 Serrurier 指出的那样,您应该使用 step/chunk 函数来更改数据而不是在解析映射之后因为内存数据已经可用。

PapaParse.parse(file, { skipEmptyLines: true, header: true, step: (results, parser) => {
                  results.data = _.pick(results.data , [ 'column1' 'column2']);
                  return results;
           }});