2009-08-21 137 views
0

我有一個以特定方式排序的.csv文件。我想通過另一個字段重新排序。您的想法將非常感激。如何重新排序60mb CSV文件

我只需要做一次,而不是多次,所以性能不是太大的問題。

我在想什麼。 如果我只是創建一個對象(Java)來保存每個字段,然後創建這些對象的ArrayList。然後,我將在我想要的字段上訂購ArrayList(我可以基於對象的一個​​成員對對象的ArrayList進行排序 - 右?),並將此重新排序的ArrayList打印到.csv文件。

+0

我將在單個文件中將所有項目與單個日期和時間相關聯,然後單獨對它們進行排序,然後將它們添加到一起。否則這將持續下去。 – Ankur 2009-08-21 06:01:40

回答

9

Souds喜歡它會工作,但也是一些矯枉過正。如果你有一個UNIX框或在cygwin你可能只是做

cat file | sort -t , +<field number> 

這將打破場了,排序的場數第二場

cat file | sort -t , +2 

排序。

+0

這可能是最簡單的答案 – Ankur 2009-08-21 04:16:28

+0

+1的方式 - 無需編碼。 – Matt 2009-08-21 04:28:50

+0

它已經花了一個多小時 - 需要考慮其他事情 – Ankur 2009-08-21 05:15:14

3

難道你不能只是將CSV加載到Excel中,使用排序功能重新排序它,然後將結果保存爲新的CSV文件?

+0

哈哈,是的,這也會工作。 – stimms 2009-08-21 04:11:03

+0

或OpenOffice如果您沒有Excel。 – 2009-08-21 04:11:37

+0

它必須是2007年。早期版本有65536行限制。 – David 2009-08-21 04:12:51

1

如果你知道如何使用Vim:http://vim.wikia.com/wiki/Working_with_CSV_files

CSV文件(逗號分隔值) 經常被用來保存 純文本數據的表格。以下是用於處理CSV文件的一些有用的技巧 。 您可以:

  • 突出顯示任何列中的所有文本。
  • 查看字段(將csv文本轉換爲列或單獨的行)。
  • 使用HJKL鍵進行導航,可以按單元格向左,向下,向右,(hjkl 正常工作)。
  • 搜索特定列中的文本。
  • 按行逐行排序。
  • 刪除一列。
  • 指定逗號以外的分隔符。
3

如果你有機會獲得一臺Linux機器,然後使用sort如上建議。但是,如果它必須是Java,那麼至少要使用現有的庫來解析CSV文件。如果你想正確處理所有的角落案例,這種格式很難解析。我建議像OpenCSV這樣的圖書館。

這段代碼展示瞭如何使用庫(與處理省略所有的錯誤!)

/** 
* Sorts a CSV file by a fixed column. 
* 
* @param col The zero-based column to sort by. 
* @param in The input CSV file. 
* @param out The output writer to receive the reordered CSV. 
*/ 
public static void sort(final int col, final Reader in, final Writer out) 
     throws IOException { 
    final List<String[]> csvContent = new ArrayList<String[]>(); 

    // parse CSV file 
    final CSVReader reader = new CSVReader(in); 
    String[] line; 
    while ((line = reader.readNext()) != null) { 
     csvContent.add(line); 
    } 
    reader.close(); 

    // sort CSV content 
    Collections.sort(csvContent, new Comparator<String[]>() { 
     @Override 
     public int compare(final String[] o1, final String[] o2) { 
      // adjust here for numeric sort, etc. 
      return o1[col].compareTo(o2[col]); 
     } 
    }); 

    // write sorted content 
    final CSVWriter writer = new CSVWriter(out); 
    writer.writeAll(csvContent); 
    writer.close(); 
} 

您可以調整代碼來處理不同的分隔符,引號字符,數字排序等