我有一个以某种方式订购的.csv文件。我想用另一个字段重新排序。非常感谢您的想法。
我只需要做一次,而不是多次,所以性能不是太大的问题。
我在想什么。 如果我只是创建一个对象(java)来保存每个字段,然后创建这些对象的ArrayList。然后我将在我想要的字段上订购ArrayList(我可以根据对象的一个成员订购对象的ArrayList - 对吗?),并将这个重新排序的ArrayList打印到.csv文件。
答案 0 :(得分:9)
Souds喜欢它会起作用,但也有些矫枉过正。如果你有一个unix box或cygwin,你可以做到
cat file | sort -t , +<field number>
这将打破字段,并按字段编号
排序cat file | sort -t , +2
按第二个字段排序。
答案 1 :(得分:3)
你不能只将csv加载到Excel中,使用sort函数对其重新排序,然后将结果保存为新的csv文件吗?
答案 2 :(得分: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();
}
您可以调整代码以处理不同的分隔符,引用字符,数字排序等。
答案 3 :(得分:1)
如果您知道如何使用Vim:http://vim.wikia.com/wiki/Working_with_CSV_files
CSV文件(逗号分隔值)是 通常用于保存数据表 纯文本。以下是一些有用的 使用CSV文件的技巧。 你可以:
- 突出显示任何列中的所有文字。
- 查看字段(将csv文本转换为列或单独的行)。
- 使用HJKL键导航,向左,向下,向上,向右移动(hjkl 正常工作)。
- 搜索特定列中的文本。
- 按列对行进行排序。
- 删除列。
- 指定逗号以外的分隔符。