2009-08-21 138 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(); 
} 

您可以调整代码来处理不同的分隔符,引号字符,数字排序等