Разбор файла CSV с неэкранированными кавычками и запятыми в .NET - PullRequest
0 голосов
/ 22 апреля 2009

Мне было интересно, может ли кто-нибудь мне помочь.

Мне нужно проанализировать данные из файла CSV и поместить их в таблицу базы данных. Пример данных выглядит следующим образом:

"первое поле", "второе , поле", "третье " поле "", "четвертое поле"

Как видите, в полях есть кавычки и запятые. Я использовал ADO.NET, но у него были проблемы со встроенными кавычками. Любое поле после встроенных кавычек будет нулевым

например. из приведенного выше примера в таблицу БД будет вставлено следующее.

first field  |  second, field   |  third     | NULL

Вот код, который я использую.

    Dim dataTable As New DataTable
    Dim dataAdapter As New OleDbDataAdapter

    Dim cmd As New OleDbCommand
    Dim path As String = "c:\"


        Dim conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
           & System.IO.Path.GetDirectoryName(filename) & ";Extended Properties=""Text;HDR=Yes;FMT=Delimited""")

        cmd.CommandText = "Select * FROM " & System.IO.Path.GetFileName(filename)
        dataAdapter.SelectCommand = cmd
        cmd.Connection = conn
        conn.Open()
        dataAdapter.Fill(dataTable)

Затем я вставляю данные в таблицу БД.

Буду очень признателен за любые советы или рекомендации по этому вопросу.

Ответы [ 5 ]

1 голос
/ 22 апреля 2009

Пока не совсем понимаю ответы.

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

Это ваше третье поле, которое представляет проблему. Как синтаксический анализатор может сказать, что после "между третьим и полем мы не завершили третий элемент? Обнаружив, что следующий символ не является запятой? Что, если третье поле также содержит запятую, это разрешено?

"first field", "second , field", "third ", Field " ", "fourth field"

В этот момент вы получаете многопроходную пробную версию и разбор ошибок (хотя я не эксперт). То есть парсер должен был бы добраться до F поля и понять, что это невозможно разобрать, создать резервную копию и включить «, в третьем поле и перейти к следующему» ... и т.д.

[Даже Excel не может справиться с этой строкой в ​​том виде, в каком она есть.]

0 голосов
/ 24 апреля 2009

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

Я решил проблему, получив надлежащие csv-файлы с экранированными кавычками и добавив проверку и обработку ошибок, когда этого не произошло.

0 голосов
/ 22 апреля 2009

Вы можете попытаться отличить кавычки, которые отделяют поле от тех, которые не проверяют, что следующее регулярное выражение может быть сопоставлено с предыдущими или следующими символами @ "\ p {Z} , \ p {Z} » Используя ту же концепцию, вы могли бы отличать запятые в тексте, кроме разграничения запятыми наличием соседних кавычек. Запуск этих эвристик, экранирование запятых и кавычек, не соответствующих приведенным выше правилам, должно привести к довольно чистому результату. Конечно, могут быть случаи, когда это не работает нормально, но, насколько я знаю, если CSV не экранирован, лучшего способа справиться с этим не будет.

0 голосов
/ 22 апреля 2009

Если ваш код не должен быть частью приложения, но вы просто хотите сгенерировать операторы SQL для обновления базы данных из данных CSV, вас может заинтересовать мой собственный проект CSVFix , который это FOSS & позволяет вам манипулировать данными CSV многими способами без программирования.

0 голосов
/ 22 апреля 2009

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

В основном у вас есть два возможных случая:

  1. Если вам гарантировано, что каждое поле отделяется двойными кавычками
  2. Где любая строка, содержащая запятые, будет ограничена двойными кавычками - вещи могут потенциально стать интересными, если у вас есть запятые внутри строк в кавычках, поэтому вам, возможно, придется установить ограничения на то, насколько умным вы хотите быть (что обеспечивает данные могут содержать).

Для первого случая, в основном, все, что вам нужно сделать, это разбить строку на комбинацию «,» (это, возможно, придется сделать вручную) - не забывая удалить начальный «из первого столбца / элемента и конечного» из последний столбец / элемент - и вы в значительной степени там.

Во втором случае вам нужно проделать дополнительную работу - либо: а) разбить строку на каждой запятой, а затем обработать результаты, соединяя смежные элементы вместе, где элемент начинается с двойной кавычки, но не заканчивается на нее ( вы объединяете поля - не забывая включать запятую - пока не найдете соответствующий элемент, который заканчивается на ", но не начинается с единицы" или б) перебираете строку на каждой итерации, вы тянете первый элемент из списка ( если он начинается с «то, что вы ищете», чтобы завершить его, в противном случае вы просто ищете запятую самостоятельно и в обоих случаях допускаете, что граничный случай делимера не будет найден, потому что вы смотрите на последний столбец.

Надеюсь, это поможет. Немного.

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