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

Removing columns from csv when cut and csvfilter both stop before finishing

我正在尝试获取一个大型 csv 文件(800,000 行,160 列)。我正在尝试删除 select 列,但保留所有行。我尝试了两种不同的方法——标准 cut 命令和 csvfilter——但它们都不会 return 所有行。事实上,它们都 return 不同的行数, cut returning 比 csvfilter 多了十几行,但都超过 4000。

我查看了原始 csv 文件,想看看是什么导致它卡住,但我什么也看不到:行中没有引号,没有特殊字符。

任何人都可以建议一种从 csv 中删除列的可靠方法或更有效地解决 csvfilter and/or 剪切问题的方法吗?我主要在 Mac 上工作,但也可以在 Windows 上工作。

我推荐 GoCSV select command. It's already built for macOS/darwin, so go straight to the latest release 并下载您选择的二进制文件。

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

试剪;比较 GoCSV

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

with open('large.csv', 'w') as f:
    # Write header
    cols = ['Count']
    cols += [f'H{k+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'C{k+1}' for k in range(159)]
        f.write(','.join(cols) + '\n')

确保大有 80 万行:

wc -l large.csv
  800001 large.csv

并且使用 GoCSV 的 dims(尺寸)命令:

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

(GoCSV 始终将第一个 row/line 计为“header”,这对 cutting/selecting 列没有任何影响)

现在删除专栏:

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 没有 filter/drop 任何 lines/rows.而 GoCSV,实际上做得更快。

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