Цитаты в файле с разделителями табуляции - PullRequest
0 голосов
/ 11 марта 2010

У меня есть простое приложение, которое открывает текстовый файл с разделителями табуляции и вставляет эти данные в базу данных.

Я использую этот CSV-ридер для чтения данных: http://www.codeproject.com/KB/database/CsvReader.aspx

И все работает просто отлично!

Теперь мой клиент добавил новое поле в конец файла, которое называется «ClaimDescription», и в некоторых из этих описаний претензий данные содержат кавычки, например:

"SUMISEI MARU NO 2" - Японское море

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

CSV, по-видимому, поврежден рядом с полем «1470» записи 26 в позиции «181». Текущие необработанные данные: ...

И в этих «необработанных данных», конечно же, в поле описания заявки отображаются данные с кавычками.

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

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

Любая помощь очень ценится!

Ура, Шон

Ответы [ 7 ]

2 голосов
/ 11 марта 2010

Проверьте комментарий к статье codeproject о кавычках:

http://www.codeproject.com/Messages/3382857/Re-Quotes-inside-of-the-Field.aspx

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

2 голосов
/ 11 марта 2010

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

1 голос
/ 07 января 2013

Недавно я решил похожую проблему, и хотя CsvReader работал должным образом на всех, кроме нескольких строк моего файла TSV, в конце концов моя проблема решалась установкой customDelimiter в конструкторе CsvReader

public static void ParseTSV(string filepath)
    {
        using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t')) {
        //if that didn't work, passing unlikely characters into the other params might help
        //using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t', '~', '`', '~', ValueTrimmingOptions.None)) {
            int fieldcount = csvReader.FieldCount;

            //Does not work, since it's read only property
            //csvReader.Delimiter = "\t";

            string[] headers = csvReader.GetFieldHeaders();

            while (csvReader.ReadNextRecord()) {
                for (int i = 0; i < fieldcount; i++) {
                    string msg = String.Format("{0}\r{1};", headers[i],
                                               csvReader[i]);
                    Console.Write(msg);
                }
                Console.WriteLine();
            }
        }
    }
0 голосов
/ 12 марта 2010

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

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

Опять же, спасибо за все предложения.

Ура, Шон

0 голосов
/ 11 марта 2010

Я провел некоторый поиск, и есть RFC для файлов CSV ( RFC 4180 ), и это явно запрещает то, что они делают:

Каждое поле может быть или не быть заключено в двойные кавычки (однако некоторые программы, такие как Microsoft Excel, не используют двойные кавычки совсем). Если поля не заключены в двойные кавычки, то двойные кавычки могут не отображаться внутри полей.

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

,""SUMISEI MARU NO 2" - sea of Japan",

Так что, если хотите, вы можете решить эту проблему и настаивать, чтобы они отправили вам «правильный» файл RFC 4180 CSV.

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

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

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

0 голосов
/ 11 марта 2010

Может быть, вы можете открыть файл в приложении и заменить каждую цитату другим символом, а затем обработать его.

0 голосов
/ 11 марта 2010
...