Лучшие практики для чтения CSV (с переменным количеством строк) в структуры данных - PullRequest
2 голосов
/ 17 августа 2010

Я пишу небольшую программу для чтения в формате csv с переменным числом строк и у меня есть вопрос о лучших практиках:

Является ли лучший способ создать хранилище для данных в каждой строке, чтобы создать массив, который содержит структуры данных CSV (по одному на каждую строку CSV)?

Размер, выделенный для массива, может быть установлен на большое число (например, больше строк, чем когда-либо разумно было бы в CSV)? Я видел это во многих примерах в Интернете.

Или ... есть ли умный способ определить, сколько места потребуется, например, подсчет строк перед рукой или динамическое добавление пространства с помощью связанного списка, а не массива со статическим распределение памяти. Какие-нибудь лучшие практики? Я не думаю, что выбор случайного числа кажется очень приятным ...

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

Ответы [ 4 ]

4 голосов
/ 17 августа 2010

Две лучшие практики:

  1. Никогда не ожидайте, что ввод извне будет корректным.
  2. Сделайте его транзакционным (импортирует все или откатит)
  3. Если возможно,использовать сторонний API или библиотеку, подобную этой http://www.codeproject.com/KB/database/CsvReader.aspx или эту http://sourceforge.net/projects/javacsv/, чтобы значительно сократить повторное изобретение колеса.Если вы придерживаетесь C и умеете делать C ++, подумайте над этим подходом: Как я могу читать и манипулировать данными CSV-файла в C ++?
3 голосов
/ 17 августа 2010

Если вы можете обрабатывать данные так, как вы их читаете, а не сохранять их и обрабатывать после, это устранит проблему.

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

Итак, в общем, мой подход -если я не могу обработать файл строкой за раз - это использовать структуру данных, которая может расти, как связанный список.Затем для каждой строки я просто выделяю новый блок.В зависимости от того, что вы делаете, вы можете использовать динамический массив: выделите объем пространства, которого должно быть достаточно для обычного случая.Если вы заполните его, выделите больше места, скопируйте первое во второе, удалите первое и затем продолжите работу со вторым.Если вы заполните это, повторите процесс.Это может быть много перемещения данных, но объем пространства, используемого в конце, будет меньше, чем связанный список, потому что у вас нет указателей, и это будет быстрее проходить, потому что вы не гонитесь за указателями и, возможно, работаетепо всей виртуальной памяти.

3 голосов
/ 17 августа 2010

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

Я согласен с другими стипендиатами.Не нужно изобретать велосипед.Там должно быть несколько миллиардов примеров о том, как анализировать CSV.

Однако, при выборе вашей любимой библиотеки, несколько слов предостережения:

  1. Рекомендация: никогда не думайте, что данные имеютопределенный (маленький или очень большой) объем данных.Следствие: не храните все данные в памяти, хотя бы разумно, и предполагайте, что независимо от размера вашего массива, данные могут быть больше его.Учитывая это, обойдем это предположение.
  2. Еще одна лучшая практика: тестируйте угловые случаи (без ввода, очень большой ввод, только одна строка или элемент и т. Д.)
  3. CSV-файлы не являютсястандарт.Например, некоторые программы, которые генерируют CSV, просто игнорируют следующие случаи:

3.1.Запятые в строках.Например, это не тот же «Смит, Джон», как Смит, Джон.3.2.Специальные символы со строками, такие как апострофы, табуляции или кавычки.Как они обрабатываются?Например, Microsoft обычно использует двойные-двойные кавычки для представления кавычек внутри строки.3.3.И, конечно же, будьте осторожны с форматом конца строки (Unix или Windows-style).

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

Удачи.Луис.Excel и Visual Basic, используемые для генерации

1 голос
/ 17 августа 2010

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

+ 1 Nissan Fan за рекомендации библиотеки, на мой взгляд, если вы не пытаетесь много узнать о синтаксическом анализе CSVи крайние случаи разбора CSV, это всегда путь.

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