Чтение / сортировка большого файла .CSV

Так что концептуально я читаю файл с ~ 2 миллионами строк данных. Я хочу отсортировать, сохранить и применить другие функции к данным позже.

  1. Мне сказали, что это называется «корзинами», но мне неясно, является ли это чем-то предопределенным или определяемым пользователем типом данных. Поэтому мне любопытно, будет ли целесообразно использовать связанный список, массив или другую комбинацию?

  2. Нужно ли беспокоиться о размере файла? Сможет ли большинство компиляторов справиться со всем этим одновременно или мне сначала нужно будет разделить данные (то есть разделить на каждый сегмент, сохранить в своем собственном файле, затем использовать другой код и т. Д.)?

  3. Если # 2 требуется, имеет ли C ++ функциональность для сохранения нескольких файлов за одно выполнение? Значение а) создать bucket1 file.txt; б) заполнить файл bucket1; закрыть файл bucket1; г) создать файл bucket2; …

1

Решение

Итак, я понял из вашего поста, что вы пишете это на C ++. Однако детали немного отличаются от требований сортировки. Но на чем вы сортируете? Все поля интерпретируются как текст? Есть какие-то цифры? Есть несколько ключей?

Если вам абсолютно не нужно писать это на C ++, и вы работаете в Linux, просто вызовите / bin / sort, чтобы выполнить сортировку. Это может показаться отговоркой, но коммерческое программное обеспечение, такое как Talend, даже прибегает к этому.

Но если вам нужно написать новый код на C ++, вот мои рекомендации:

1) Файл CSV экранирован? Другими словами, нуждаются ли в специальной обработке вложенные кавычки и разделители? Вы должны выяснить это в первую очередь.

2) Проверьте это: http://mybyteofcode.blogspot.com/2010/02/parse-csv-file-with-boost-tokenizer-in.html

3) Простое представление отсканированного ввода vector<vector<string> >, Но это громоздко. Вместо этого, оберните класс вокруг vector<string> и создать вектор указателей на эти классы, по одному на строку ввода, и вместо этого отсортировать их.

4) Вы должны быть в состоянии сортировать ~ 2M «средних» строк в памяти в эти дни. Просто используйте std :: sort. Но для полной общности вам нужно будет подумать, а что, если оно не умещается в памяти? Наиболее распространенным ответом на это является одновременная сортировка фрагментов, запись результатов на диск, а затем объединение их с использованием очереди приоритетов или аналогичной структуры.

0

Другие решения

Других решений пока нет …