Разбор большого файла CSV, работа с запятыми и кавычками - PullRequest
1 голос
/ 12 октября 2010

Мне нужно загрузить большой CSV-файл (> 1 МБ) и разобрать его.Как правило, это довольно легко сделать, разделив сначала на разрывы строк, а затем запятые.Проблема в том, что некоторые записи содержат строки, которые содержат свои запятые.Когда эта электронная таблица преобразуется в CSV, строки, содержащие запятые, заключаются в кавычки.

Я написал синтаксический анализатор, который сначала экранирует все запятые в этих строках, затем разделяет его на разрывы строк, а затем запятые, а затемснова удаляет значения

Это довольно медленный процесс для такой длинной строки, поскольку мне нужно перебирать всю строку.Кто-нибудь знает более быстрый или более оптимизированный метод борьбы с этим?

Ответы [ 3 ]

2 голосов
/ 12 октября 2010

Вы уже смотрели на csvlib еще? Это библиотека синтаксического анализатора для ActionScript 3. Она претендует на то, чтобы быть спроектированной для правильной обработки строк в кавычках.

Надеюсь, вы уже заключили свои строки в кавычки, особенно те, которые содержат запятые. Парсеры CSV не могут отличить запятую, являющуюся частью строки, от запятой, которая разделяет две строки, если строки не содержат кавычек.

    
Good
    "This string, has a comma", "This string doesn't"

Bad
    This string, has a comma, this string doesn't
1 голос
/ 12 октября 2010

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

0 голосов
/ 11 апреля 2012
  • Добавить ссылку на Microsoft.VisualBasic (да, там написано VisualBasic, но она работает и в C # - помните, что в конце это всего лишь IL)
  • Используйте Microsoft.VisualBasic.FileIO.TextFieldParser класс для разбора файла CSV

Вот пример кода:

    Dim parser As TextFieldParser = New TextFieldParser("C:\mar0112.csv")
    parser.TextFieldType = FieldType.Delimited
    parser.SetDelimiters(",")

    While Not parser.EndOfData
        'Processing row    
        Dim fields() As String = parser.ReadFields
        For Each field As String In fields
            'TODO: Process field     

        Next

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