【问题标题】:How to remove empty cells from csv while parsing csv using PapaParse?如何在使用 PapaParse 解析 csv 时从 csv 中删除空单元格?
【发布时间】:2020-03-12 14:56:48
【问题描述】:

或者用另一种方式提出问题:为什么在 Papa.step() 函数期间修剪所有前导和尾随空单元格时,PapaParse 的 ParseResult.data 是一个空数组?编辑:请注意,我可以通过映射解析结果和修剪来实现我想要的,但我不想先解析然后映射,我宁愿一次性完成。

CSV 示例:

Col 1,Col 2,Col 3
1-1,1-2,
,2-2,2-3
3-1,3-2,3-3

请注意,第 1 行包含标题(Col 1、Col 2 等)。第 2 行第 3 列为空,并且 第 3 行第 1 列为空。

鉴于该 CSV,我想将其呈现给用户(作为格式良好的 表):

|     |     |     |
|-----|-----|-----|
| 1-1 | 1-2 |     |
| 2-2 | 2-3 |     |
| 3-1 | 3-2 | 3-3 |

我想将所有行尽可能向左推,并删除所有空行 每行末尾的单元格。

换句话说,我想从头到尾修剪所有空单元格 每行的末尾。下面是我正在使用的代码。我已经把调试器放在里面 trimEmptyCells,它的表现完全符合预期。但是, ParseResult parseAndTrim 返回包含一个空的 data 数组。

export const parseAndTrim = (csv: string): Papa.ParseResult => {
    return Papa.parse(csv, {
        skipEmptyLines: true,
        step: trimEmptyCells,
    })
};

const trimEmptyCells = (results: Papa.ParseResult) => {
    // Note that `_.dropWhile` and `_.dropRightWhile` are [lodash
    // functions](https://lodash.com/docs/4.17.15#dropRight).
    const leftTrimmed = _.dropWhile(results.data, (r) => r === "");
    return _.dropRightWhile(leftTrimmed, (r) => r === "");
};

我的第一个猜测是 PapaParse 遇到长度不同的数组的错误,但是 errors 数组也是空的。所以我测试了我能做的(没有step函数) 在https://www.papaparse.com/demo 使用下面的示例并简单地拥有 missing 单元格(不仅仅是空的)不会引发错误并返回正确的data 数组。

https://www.papaparse.com/demo 的示例测试输入

Col 1,Col 2,Col 3
1-1,1-2
,2-2,2-3

【问题讨论】:

    标签: csv papaparse


    【解决方案1】:

    基于来自pokolithis comment(PapaParse 的#2 贡献者和自 2017 年初以来的#1 贡献者),我相信这是不可能的。 pokoli 提出的解决方案是

    您应该使用 Papa.parse 将记录读取为数组,过滤它们,然后使用 Papa.Unparse 写入第二个文件。

    我希望我可以在解析时改变数据以更快,但 PapaParse 非常快。我能够在 300 毫秒内解析一个 36,000 行的 csv,并在两次时间内解析。解析一个 2,000 行的 csv 花费了不到 30 毫秒,而再次解析则花费了两倍的时间。我的用例将在 99% 的时间内涉及 2,000 行以下的 CSV,因此解析为 2d 数组、过滤、解解析回 csv,然后再次解析为 json 不会花费太长时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2012-10-16
      • 2015-02-15
      相关资源
      最近更新 更多