Как изменить порядок файла CSV 60 МБ - PullRequest
0 голосов
/ 21 августа 2009

У меня есть файл .csv, который упорядочен определенным образом. Я хочу изменить порядок на другое поле. Ваши идеи будут высоко оценены.

Я должен сделать это только один раз, а не несколько раз, так что производительность не слишком большая проблема.

Что я думаю. Если я просто создаю объект (java) для хранения каждого из полей, а затем создаю ArrayList из этих объектов. Затем я закажу ArrayList в нужном мне поле (я могу заказать ArrayList объектов на основе одного члена объекта - верно?) И распечатать переупорядоченный ArrayList в файле .csv.

Ответы [ 4 ]

9 голосов
/ 21 августа 2009

Звучит так, как будто это будет работать, но это также излишнее количество. Если у вас есть Unix Box или Cygwin, вы можете просто сделать

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

Это разделит поля на и отсортирует по номеру поля

cat file | sort -t , +2

сортирует по второму полю.

3 голосов
/ 21 августа 2009

Если у вас есть доступ к 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 голосов
/ 21 августа 2009

Разве вы не можете просто загрузить CSV в Excel, использовать функцию сортировки, чтобы изменить его порядок, а затем сохранить результат как новый CSV-файл?

1 голос
/ 21 августа 2009

Если вы знаете, как использовать Vim: http://vim.wikia.com/wiki/Working_with_CSV_files

CSV-файлы (значения, разделенные запятыми) часто используется для сохранения таблиц данных в простой текст. Ниже приведены некоторые полезные методы работы с файлами CSV. Вы можете:

  • Выделите весь текст в любом столбце.
  • Просмотр полей (преобразовать текст CSV в столбцы или отдельные строки).
  • Перемещение с помощью клавиш HJKL идти влево, вниз, вверх, вправо по ячейке (hjkl работать как обычно).
  • Поиск текста в определенном столбце.
  • Сортировка строк по столбцам.
  • Удалить столбец.
  • Укажите разделитель, отличный от запятой.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...