2011-06-07 66 views
0

有沒有辦法使用sort來排序非常大的CSV文件?
但是,只需按第一列排序,數據可能包含一列中的換行符(適用標準CSV文件規則)。線路斷裂會破壞sort實用程序嗎?使用unix utililty排序csv文件排序

+0

其實相當困難。您可能想看看我的FOSS項目http://code.google.com/p/csvfix/,它可以對CSV文件進行排序等等,並且可以在Unix上運行。 – 2011-06-07 18:40:31

+0

@Neil Bufferworth:酷!它是否適用於在列數據中換行的大型csv文件? – user775187 2011-06-07 19:26:31

+0

以及1000萬行上csvfix的性能如何? – user775187 2011-06-07 19:36:24

回答

0

我相信你應該嘗試這樣cat old.csv | sort > new.csv

UPD:爲了準備如果需要,我們可以使用AWK腳本數據....

+0

正確地閱讀問題。 _「數據可能包含換行符」_ – ssapkota 2011-06-07 18:43:46

+0

使用AWK腳本準備數據非常簡單,它準確地用於準備(格式化)巨大的日誌文件))我沒有說這個命令會起作用,我很傷心這個... – 2011-06-07 18:48:37

0

排序功能將在asciicographical順序排序行。要獲得更復雜的效果,可以使用UNIX實用程序awk。

0

你可以使用混合的實用程序。希望我已經正確地理解了它......如果是這樣,這可能會完成這項工作。如果不是,請指出我在哪裏出錯了:-)這要求每個CSV記錄的字段數量是固定的(這也是一個簡單的例子,不包括各種CSV變體(例如,「你好」,「世界,怎麼樣」,是,你會發現如 「的世界裏,如何」 將被分成兩個字段)):

hello,world,how,are,you 
one,two,three,four,five 
once,I,caught,a 
fish,alive 
hey,now,hey,now,now 

這awk腳本:

BEGIN { 
     FS="," 
     fields=0 
} 

{ 
     if (line == "") { 
       fields=NF 
       line = $0 
     } else { 
       fields=fields + (NF - 1) 
       line=line"|"$0 
     } 
} 

fields == 5 { 
     print line 
     fields = 0 
     line = "" 
} 

執行此:

awk -f join.awk < infile | sort | tr '|' '\n' 

給出這個輸出:

hello,world,how,are,you 
hey,now,hey,now,now 
once,I,caught,a 
fish,alive 
one,two,three,four,five 

從本質上講,所有我們正在與awk腳本做的是合併多行記錄到一個單一的線,我們可以再喂到sort,然後用tr再次突破。我使用管道作爲換行符的替代品 - 只要選擇您可以保證的內容就不會出現在CSV記錄中。

現在它可能不是完美的你想要的,但希望它會推動你在正確的方向。 awk腳本的主要內容是它需要知道每個CSV記錄有多少個字段。這需要修復。如果它是可變的,那麼所有的賭注都是關閉的,因爲在那裏需要更多的規則確定要分類的文件的語義性質...

0

更簡單的方法是暫時修改您的數據標準UNIX排序命令可以正確解釋您的數據。

您可以使用一個名爲csvquote的程序,它可以替換帶有非打印字符的引用字段值中有問題的逗號和換行符。然後它會在管道末端恢復這些字符。

例如,

csvquote inputfile.csv | sort | csvquote -u 

您可以在這裏找到代碼:https://github.com/dbro/csvquote