我正在嘗試獲取一個大型 csv 檔案(800,000 行,160 列)。我正在嘗試洗掉選擇列,但保留所有行。我嘗試了兩種不同的方法——標準剪切命令和 csvfilter——但它們都不會回傳所有行。事實上,它們都回傳不同的行數,cut 回傳的行數比 csvfilter 多一打左右,但都略高于 4000。
我查看了原始 csv 以嘗試查看可能導致它窒息的原因,但我什么也看不到:行中沒有引號,沒有特殊字符。
任何人都可以建議一種可靠的方法來從 csv 中洗掉列,或者一種更有效地對 csvfilter 和/或 cut 進行故障排除的方法嗎?我主要在 Mac 上作業,但也可以在 Windows 上作業。
uj5u.com熱心網友回復:
我推薦 GoCSV 的select命令。它已經為 macOS/darwin 構建,所以直接進入最新版本并下載您選擇的二進制檔案。
我不確定為什么csvfilter會截斷您的檔案。我特別懷疑剪切會消除任何線條,但我之前沒有嘗試過 800K 線條。
測驗切割;比較 GoCSV
這是生成 CSV 的 Python 腳本large.csv,即 800_000 行 x 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')
確保 large 有 800K 行:
wc -l large.csv
800001 large.csv
并使用 GoCSV 的dims (dimensions) 命令:
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-aware 工具。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/391113.html
上一篇:如何將熊貓資料添加到GoogleCloudStorage中的現有csv檔案?
下一篇:將'sep='行添加到csv檔案
