![](/img/trans.png)
[英]Python: Split CSV file according to first character of the first column
[英]Splitting large csv file by column first letter according to alphabetic order linux
我想拆分一個包含行的大型 csv 文件,如下所示:
1,amine,22,001
2,amy,35,224
3,david,80,77
使用第二列的第一個字母並按照字母順序,所以結果應該是 2 個文件:
a.csv:
1,amine,22,001
2,amy,35,224
和
d.csv:
3,david,80,77
謝謝!
它(也許令人驚訝)很簡單
awk -F, '{print > (substr($2,1,1) ".csv")}' large.csv
健壯、便攜、高效的方法是(未經測試):
sort -t',' -k2,2 file |
awk -F',' '
{ key = substr($2,1,1) }
key != prev {
close(out)
out = key ".csv"
prev = key
}
{ print > out }
'
以上假設您不關心每個輸出文件中的行順序。
python
解決方案,讓file.csv
內容為
1,amine,22,001
2,amy,35,224
3,david,80,77
和位於同一目錄中的splitter.py
是
def get_output_filename(row):
return row[row.index(",")+1]+".csv"
with open("file.csv","r") as f:
for line in f:
with open(get_output_filename(line),"a") as g:
g.write(line)
然后
python splitter.py
將創建包含內容的文件a.csv
1,amine,22,001
2,amy,35,224
和帶有內容的d.csv
3,david,80,77
說明:我編寫了函數get_output_filename
,它在 first 之后直接查找字符,
並將其與.csv
。 for line in f
避免將整個文件加載到內存(因此file.csv
可能比內存大),使用a
模式進行追加,輸出文件在寫入后立即關閉,因此在任何時候最多打開 2 個文件(一份用於閱讀,一份用於附加)。 免責聲明: python splitter.py
應該只執行一次。
(在 Python 3.8.10 和 Python 2.7.18 中測試)
你沒有要求這個,只是為了好玩,因為你已經用你要求的語言得到了答案,下面是你如何在 R 中做到這一點:
library(data.table)
df <- fread('input.csv')[, g := substr(V2, 1, 1)]
df[, fwrite(.SD, paste0(g, '.csv'), col.names = F), by = g]
這是一個shell解決方案:
while IFS=$'\t' read -r letter line
do
echo "$line" >> "$letter.csv"
done < <(sed -E 's/^([^,]*,)([a-z])(.*$)/\2\t\1\2\3/' file)
如果有可能存在[az].csv
類型的先前文件,您需要添加rm *.csv
因為>>
將每一行附加到該文件(如果文件不存在,則創建該文件。)
這里的優點是尊重file
的原始行順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.