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