如何在使用 PapaParse 解析 csv 时从 csv 中删除空单元格?

How to remove empty cells from csv while parsing csv using PapaParse?

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

CSV 示例:

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

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

鉴于 CSV,我想将其呈现给用户(作为 nicely-formatted table):

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

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

换句话说,我想 trim 开头和结尾的所有空单元格 每行的末尾。下面是我正在使用的代码。我把调试器放在里面 trimEmptyCells 并且完全符合预期。然而,ParseResult parseAndTrim returns 包含一个空的 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 使用下面的示例并简单地具有 缺少 个单元格(不仅仅是空的)不会抛出任何错误并且 returns 一个正确的 data 数组。

https://www.papaparse.com/demo

处的示例测试输入
Col 1,Col 2,Col 3
1-1,1-2
,2-2,2-3

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

You should use Papa.parse to read records as array, filter them and then use Papa.Unparse to write the second file.

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