C # CSV динамическое разделение - PullRequest
3 голосов
/ 28 октября 2011

У меня есть несколько 1,5 ГБ CSV-файлов, которые содержат платежную информацию по нескольким учетным записям для клиентов от поставщика услуг.Я пытаюсь разбить большой CSV-файл на более мелкие куски для обработки и форматирования данных внутри него.

Я не хочу развертывать собственный синтаксический анализатор CSV, но это то, чего я еще не видел, поэтому, пожалуйста,поправь меня если я не прав.Файлы объемом 1,5 ГБ содержат информацию в следующем порядке: информация об учетной записи, номер счета, дата выставления счета, транзакции, Ex gst, Inc gst, тип и другие строки.

обратите внимание, что BillDate здесь означает дату, когда счет былсделано, так что иногда у нас есть более двух дат выставления счетов в одном CSV.

Счета сгруппированы по: Номер счета> Дата выставления> Транзакции.

Некоторые счета имеют 10 строк сведений о транзакции,некоторые из них содержат более 300 000 строк сведений о транзакции.Большой 1,5 ГБ CSV-файл содержит около 8 миллионов строк данных (я раньше использовал UltraEdit), чтобы разрезать вставку на более мелкие куски, но это стало очень неэффективным и длительным процессом.

Я просто хочу загрузить большой CSVфайлы в моей WinForm, нажмите кнопку, чтобы разбить эти большие файлы на куски, скажем, не более 250 000 строк, но некоторые счета на самом деле превышают 250 000 строк, и в этом случае они сохраняются в одном куске, а не разделяются по нескольким файлам, так как онив любом случае заказаны.Также я не хочу иметь учетные записи с несколькими датами выставления счетов в CSV, и в этом случае разделитель может создать еще один дополнительный разделитель.

У меня уже есть приложение WinForm, которое автоматически выполняет форматирование CSV в меньшие файлы в VSC # 2010.

Возможно ли на самом деле обрабатывать эти очень большие файлы CSV?Я пытался загрузить большие файлы, но MemoryOutOfException раздражает, так как он каждый раз падает, и я не знаю, как это исправить.Я открыт для предложений.

Вот что я должен делать:

  • Загрузить большой CSV-файл (но не удается, поскольку OutOfMemoryException).Как решить эту проблему?
  • Сгруппируйте данные по имени учетной записи, дате выставления счета и подсчитайте количество строк для каждой группы.
  • Затем создайте массив целых чисел.
  • Передайте этот массив целых чисел процессу разделения файлов, который возьмет эти массивы и запишет блоки данных.

Любые предложения будут с благодарностью.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 28 октября 2011

Вы можете использовать CsvReader для потоковой передачи и анализа данных без необходимости загружать все это в память за один раз.

1 голос
/ 28 октября 2011

Да об этом .... нехватка памяти случится с файлами, которые ОГРОМНЫ.Вы должны серьезно относиться к вашей ситуации.

Как и в случае большинства проблем, разбейте все на шаги.

Ранее у меня был подобный тип ситуации (большой файл данных в формате CSV, необходимо обработатьи т. д.)

Что я сделал:

Сделайте шаг 1 из вашего набора программ или что-то еще, что-то, что просто разрезает ваш огромный файл на множество меньших файлов.Я разбил 5ГБ зашифрованные PGP файлы (после расшифровки ... это еще одна головная боль) на множество меньших частей.Вы можете сделать что-то простое, например, последовательно пронумеровав их (например, 001, 002, 003 ...)

. Затем создайте приложение для обработки ввода.Здесь нет настоящей бизнес-логики.Я ненавижу FILE IO со страстью, когда дело доходит до бизнес-логики, и мне нравится теплое нечеткое ощущение данных, находящихся в хорошей БД SQL Server.Это всего лишь я.Я создал пул потоков, и у него N потоков (например, 5, вы сами решаете, сколько может обрабатывать ваша машина), чтобы прочитать созданные вами файлы деталей .csv.

Каждый поток читает один файл.Отношения один к одному.Поскольку это файловый ввод / вывод, убедитесь, что у вас не слишком много запущенных одновременно.Каждый поток выполняет одну и ту же базовую операцию.Считывает данные, помещает их в базовую структуру для базы данных (формат таблицы), выполняет много операций вставки, а затем завершает поток.Я использовал LINQ to SQL, потому что все строго типизировано, а что нет, но каждому свое.Чем лучше дизайн базы данных, тем лучше для вас будет выполнять логику позже.

После того, как все потоки завершат выполнение, у вас есть все данные из исходного CSV в базе данных.Теперь вы можете делать всю свою бизнес-логику и делать что угодно оттуда.Не самое симпатичное решение, но я был вынужден разработать его, учитывая мою ситуацию / поток данных / размер / требования.Вы можете пойти с чем-то совершенно другим.Думаю, просто делюсь.

0 голосов
/ 28 октября 2011

В пространстве имен Microsoft.VisualBasic.FileIO есть очень полезный класс, который я использовал для работы с CSV-файлами - TextFieldParser Class .

. Он может не помочь с большим размером файла., но он встроен и обрабатывает поля в кавычках и без кавычек (даже если они смешаны в одной строке).Я использовал его пару раз в проектах на работе.

Несмотря на название сборки, может использоваться с C #, если вам интересно.

0 голосов
/ 28 октября 2011

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

Надеюсь, возможно, есть некоторые готовые реализации внешней сортировки для .NET, которые вы могли бы использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...