0

我有一个以某种方式排序的 .csv 文件。我想按另一个字段重新排序。您的想法将不胜感激。

我只需要这样做一次,而不是多次,所以性能不是太大的问题。

我在想什么。如果我只是创建一个对象(java)来保存每个字段,然后创建这些对象的 ArrayList。然后,我将在我想要的字段上订购 ArrayList(我可以根据对象的一个​​成员订购对象的 ArrayList - 对吗?),并将这个重新排序的 ArrayList 打印到 .csv 文件中。

4

4 回答 4

9

听起来它会起作用,但也有些矫枉过正。如果你有一个 unix box 或 cygwin 你可以做

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

这将按 分解字段,并按字段编号排序

cat file | sort -t , +2

按第二个字段排序。

于 2009-08-21T04:08:18.047 回答
3

您不能将 csv 加载到 Excel 中,使用排序功能对其进行重新排序,然后将结果另存为新的 csv 文件吗?

于 2009-08-21T04:03:56.680 回答
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();
}

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

于 2009-08-21T04:51:20.127 回答
1

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

CSV 文件(逗号分隔值)通常用于以纯文本格式保存数据表。以下是处理 CSV 文件的一些有用技术。你可以:

  • 突出显示任何列中的所有文本。
  • 查看字段(将 csv 文本转换为列或单独的行)。
  • 使用 HJKL 键按单元格向左、向下、向上、向右导航(hjkl 正常工作)。
  • 在特定列中搜索文本。
  • 按列对行进行排序。
  • 删除一列。
  • 指定逗号以外的分隔符。
于 2009-08-21T04:38:06.660 回答