切割时从 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 都在完成之前停止的主要内容,如果未能解决你的问题,请参考以下文章