Кавычки в файле с разделителями в виде табуляции

StackOverflow https://stackoverflow.com/questions/2425800

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

"СУМИСЭЙ МАРУ № 2" - Японское море

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

CSV-файл, похоже, поврежден рядом с записью '1470', поле '26' в позиции '181'.Текущие необработанные данные :...

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

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

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

Мы очень ценим любую помощь!

Твое здоровье, Шон

Это было полезно?

Решение 7

Верно, после поздней ночи, проведенной в Redbull и почесывая затылок, я в конце концов нашел проблему: это были запятые в поле «Claim_Description».Даже не думал об этом, потому что я использовал файл, разделенный табуляцией, но как только я нашел и заменил все запятые в файле, все заработало абсолютно нормально!

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

Еще раз спасибо за все предложения.

Приветствую, Шон

Другие советы

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

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

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

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

Недавно я решил подобную проблему, и хотя 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();
            }
        }
    }

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top