簡體   English   中英

根據字母順序linux按列第一個字母拆分大型csv文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM