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

如何在使用PapaParse解析csv时从csv中删除空单元格?,csv,papaparse,Csv,Papaparse,或者换一种方式问:为什么PapaParse的ParseResult.data在Papa.step()函数中修剪所有前导和尾随空单元格时是空数组?编辑:请注意,我可以通过映射解析的结果和修剪来实现我想要的,但我不想解析然后映射,我宁愿一次完成 示例CSV: Col 1,Col 2,Col 3 1-1,1-2, ,2-2,2-3 3-1,3-2,3-3 请注意,第1行包含标题(第1列、第2列等)。第2行第3列为空,并且 第3行第1列为空 有了这个CSV,我想把它展示给用户(作为一个格式很好的文件)

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

示例CSV:

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

有了这个CSV,我想把它展示给用户(作为一个格式很好的文件) 表):

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

换句话说,我想从开始和结束都修剪所有空单元格 每行的末尾。下面是我正在使用的代码。我已经把调试器放在了
trimpentycells
,它的表现完全符合预期。然而,结果是 返回的
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
函数) 在使用下面的示例时 缺少的单元格(不仅仅是空的)不会抛出错误并返回正确的
数据
数组

测试输入示例

根据from(PapaParse的第2名撰稿人和2017年初以来的第1名撰稿人),我认为这是不可能的。pokoli提出的解决方案是

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

我希望我可以在解析时对数据进行变异以加快速度,但PapaParse非常快。我能够在300毫秒内解析36000行csv,并在两倍的时间内解析。解析一个2000行的csv需要不到30毫秒的时间,而再次解析需要两倍的时间。我的用例将99%的时间涉及2000行以下的csv,因此解析到2d数组、过滤、解析回csv,然后再次解析到json不会花费太长时间

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 === "");
};
Col 1,Col 2,Col 3
1-1,1-2
,2-2,2-3