2016-05-11 34 views
0

我在考慮以下問題。垂直分割一個數組,所以我們得到最小分割

我可以有一個字符串像

Col1 Col2 Col3 Col4 
aa  aa  aa  aa 
aaa aaa  aaaaa aaa 
aaaa aaaaaaa aa  a 
........................... 

數組其實這是CSV文件。我應該找到一種方法將它垂直分割成一個或多個文件。分裂的條件是沒有一個文件不包含超過某些字節的行。爲簡單起見,我們可以重寫數組的長度:

Col1 Col2 Col3 Col4 
2  2  2  2 
3  3  5  3 
4  7  2  1 
........................... 

而且我們說的限值是10,即如果> 9我們應該分開。所以如果我們分成兩個文件[Col1, Col2, Col3][Col4]這將不會滿足條件,因爲第一行文件的第二行將包含3 + 3 + 5 > 9,第三行包含4 + 7 + 2 > 9。如果我們分成[Col1, Col2][Col3, Col4]這將不會滿足條件,因爲第一個文件將包含第三行中的4 + 7 > 9。所以我們把它分成3個文件,如[Col1],[Col2, Col3][Col4]。現在每個文件是正確的,看起來像:

File1 | File2   | File3 
------------------------------ 
Col1 | Col2 Col3 | Col4 
2  | 2  2  | 2  
3  | 3  5  | 3  
4  | 7  2  | 1  
............................... 

所以應該拆分從左至右給出的最大列數儘量向左文件。問題是這個文件可能很大,我不想將它讀入內存,所以我們逐行讀取最初的文件,並以某種方式確定一組要分割的索引。如果這是可能的呢?我希望我能很好地描述這個問題,這樣你就能理解它。

+0

列可以交換? –

+0

有多少列和行? –

+0

最多2,500列,最多10,000行。將來可能會更多。列不能交換,移動等。 –

回答

0

通常awk在處理大型csv文件方面非常出色。

您可以嘗試類似this的方法來檢索每列的最大長度,然後決定如何拆分。

比方說,file.txt的包含

Col1;Col2;Col3;Col4 
aa;aa;aa;aa 
aaa;aaa;aaaaa;aaa 
aaaa;aaaaaaa;aa;a 

(假設windows風格引號)運行以下:

> awk -F";" "NR>1{for (i=1; i<=NF; i++) max[i]=(length($i)>max[i]?length($i):max[i])} END {for (i=1; i<=NF; i++) printf \"%d%s\", max[i], (i==NF?RS:FS)}" file.txt 

將輸出:

4;7;5;3 

難道你試試這個你的真實數據集?

+0

只有每列的最大值不能找到最佳解決方案。 –

+0

這是什麼給我?我不能從'4; 7; 5; 3'做出決定,我可以嗎? –

+0

4; 7; 5; 3告訴你,你可以合併列1和3,因爲'4 + 5 <= 9' 然後你解決9; 7; 3你不能根據你的規則減少所以三個文件:(1 ; 3)(2)(4)。 – hoang