2013-03-26 4 views
0

Воспользовавшись SQL Server Bulk insert of CSV file with inconsistent quotes (опция CsvToOtherDelimiter), я обнаружил несколько странностей с частью RemoveCSVQuotes [он нарезал последний символ из цитируемых строк, содержащих запятую!]. Так что .. переписал этот бит (может быть, ошибка?)Обработка строк/CSV-вызов

Одна морщина заключается в том, что клиент спросил: «Как насчет данных?»

""17.5179C,"" 

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

Чтобы уточнить: мы используем C# для предварительной обработки файла в формате с разделителями каналов до запуска массовой вставки с использованием файла формата. Скорость очень важна.

ответ

0

Чтобы преобразовать строку CSV в список элементов, вы можете написать программу, которая отслеживает состояние (в кавычках или вне кавычек), когда оно обрабатывает строку по одному символу за раз, и испускает найденные элементы , Правила цитирования в CSV: weird, поэтому вы хотите убедиться, что у вас много тестовых данных.

Государственная машина может идти, как это:

  1. сканирования до цитаты (перейти к 2) или запятую (3) выберите
  2. , если следующий символ цитата, добавьте только один из двух кавычки в поле и вернуться к 1. В противном случае перейдите к 4 (или сообщите об ошибке, если котировка не является первым символом в поле).
  3. испускать поле, перейдите к 1
  4. сканирования до цитаты (перейти к 5)
  5. , если следующий символ цитата, добавьте только один из двух кавычек в поле и вернуться к 4. В противном случае, выделяющий поле, сканирование запятой, и перейти к 1.

Это должно материал правильно сканирования, как:

  • привет, мир, 123, 456
  • "привет мир", 123, 456
  • «Он сказал„“Привет, мир!» «», «И я сказал привет»
  • «» 17.5179C «» (правильно сообщает об ошибке, так как должна быть разделителем между первой строкой в ​​кавычках "" и второе поле 17.5179C).

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

редактировать:

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

+0

Мне нужно будет подтвердить, но я думаю, что клиент хочет «17.5179C», «в конечном итоге, как« 17.5179C », в базе данных. – kpollock

+0

Поскольку существует много вариантов, возможно, это имеет смысл для вашего клиента. Я рекомендую вам получить четкую спецификацию (или, по крайней мере, множество примеров того, что они хотят). Должно быть легко адаптировать алгоритм, который я там установил, чтобы использовать «» как разделители для цитируемых строк вместо «. – redtuna

+0

@kpollock. Или вы можете просто использовать парсер CSV, встроенный в платформу .NET (http://msdn.microsoft .com/en-us/library/microsoft.visualbasic.fileio.textfieldparser.aspx) и получить его в первый раз. – Tergiver

0

Принятый ответ от вашей ссылки начинается с:

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

Почему бы не преобразовать ваш CSV в xml? Затем вы сможете проверить свои данные против xsd перед хранением в базе данных.

0

Я закончил использование парсера csv, который, как я уже не знал, уже (входит в состав нашего инструмента генерации кода), и отмечая, что «17.5179C», «недействителен и вызывает ошибки.