切割时从 csv 中删除列,并且 csvfilter 都在完成之前停止

Posted

技术标签:

【中文标题】切割时从 csv 中删除列,并且 csvfilter 都在完成之前停止【英文标题】:Removing columns from csv when cut and csvfilter both stop before finishing 【发布时间】:2022-01-23 04:29:37 【问题描述】:

我正在尝试获取一个大型 csv 文件(800,000 行,160 列)。我正在尝试删除选择列,但保留所有行。我尝试了两种不同的方法——标准剪切命令和 csvfilter——但它们都不会返回所有行。事实上,它们都返回不同数量的行,cut 返回的行数比 csvfilter 多十几个,但都略高于 4000。

我查看了原始 csv 以尝试了解可能导致其窒息的原因,但我什么也看不到:行中没有引号,没有特殊字符。

谁能建议一种可靠的方法来从 csv 中删除列,或者更有效地解决 csvfilter 和/或 cut 问题?我主要在 Mac 上工作,但也可以在 Windows 上工作。

【问题讨论】:

你的问题标题提到“在完成前停止”......是否有错误? 完全没有错误。它刚刚完成,然后当我打开输出时,它只有 4000 多行。 【参考方案1】:

我推荐 GoCSV 的 select 命令。它已经为 macOS/darwin 构建,因此请直接访问 the latest release 并下载您选择的二进制文件。

我不确定为什么 csvfilter 会截断您的文件。我特别怀疑 cut 会消除任何行,但我之前没有尝试过 800K 行。

测试切割;比较 GoCSV

这是一个 Python 脚本,用于生成 CSV,large.csv,即 800_000 行 x 160 列:

with open('large.csv', 'w') as f:
    # Write header
    cols = ['Count']
    cols += [f'Hk+1' for k in range(159)]
    f.write(','.join(cols) + '\n')

    # Write data
    for i in range(800_000):
        cols = [str(i+1)]
        cols += [f'Ck+1' for k in range(159)]
        f.write(','.join(cols) + '\n')

确保 large 有 800K 行:

wc -l large.csv
  800001 large.csv

使用 GoCSV 的 dims(维度)命令:

gocsv dims large.csv 
Dimensions:
  Rows: 800000
  Columns: 160

(GoCSV 总是将第一行/第一行视为“标题”,这对剪切/选择列没有任何影响)

现在切割列:

time cut -d ',' -f1,160 large.csv > cut.csv
cut -d, -f1,160 large.csv > cut.csv  8.10s user 0.38s system 99% cpu 8.483 total
time gocsv select -c 1,160 large.csv > gocsv_select.csv
gocsv select -c 1,160 large.csv > gocsv_select.csv  5.25s user 2.55s system 106% cpu 7.322 total

比较两种方法:

cmp gocsv_select.csv cut.csv

而且由于它们是相同的,所以看一个的头部和尾部对两者都很重要:

head -n2 cut.csv 
Count,H159
1,C159

tail -n2 cut.csv 
799999,C159
800000,C159

所以,两者都做了看起来正确的事情,特别是 cut 没有过滤/删除任何行/行。而 GoCSV,实际上做得更快。

我很好奇您的 cut 命令是什么样的,但我认为更重要的一点是尽可能使用支持 CSV 的工具(总是) .

【讨论】:

gocsv 完全符合我对其他两个的预期:返回所有行。谢谢!这太棒了! 哇!多么奇怪,尤其是 csvfilter 失败了。好吧,很高兴它成功了!

以上是关于切割时从 csv 中删除列,并且 csvfilter 都在完成之前停止的主要内容,如果未能解决你的问题,请参考以下文章

转换为列表时从数据框中删除某些列

bash方法从csv文件中删除最后4列

上传时从字符串中删除换行符

cascsv怎么处理

编写一个函数以在退出目录时从目录中删除所有文件

点击 SwiftUI 时从列表中删除