Кавычки в файле с разделителями в виде табуляции
-
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();
}
}
}
используйте OleDbConnectionhttp://social.msdn.microsoft.com/Forums/en/winformsdatacontrols/thread/98fce7d7-b02d-4027-ad2e-2df3a28bd439
Возможно, вы сможете открыть файл в своем приложении и заменить каждую кавычку другим символом, а затем обработать его.
Я немного поискал, и там есть RFC для CSV-файлов (RFC 4180), и это явно запрещает то, что они делают:
Каждое поле может быть заключено в двойные кавычки, а может и не быть (однако некоторые программы, такие как Microsoft Excel, вообще не используют двойные кавычки ).Если поля не заключены в двойные кавычки, то двойные кавычки могут не отображаться внутри полей.
В принципе, если они хотят это сделать, им нужно заключить все это поле в кавычки, вот так:
,""SUMISEI MARU NO 2" - sea of Japan",
Так что, если вы хотите, вы можете переложить эту проблему на них и настоять, чтобы они отправили вам "правильный" CSV-файл RFC 4180.
Поскольку у вас есть доступ к исходным файлам для этого CSV-ридера, другим вариантом было бы изменить его для обработки строк в кавычках, которые они вам предоставляют.
Именно в такой ситуации жизненно важно иметь доступ к исходному коду вашего набора инструментов.
Если вместо этого вы хотели бы предварительно обработать (взломать) их файлы, прежде чем отправлять их в свой инструмент, правильным методом было бы искать поля с кавычками не непосредственно перед разделителем или за ним, а заключить все его поле в другой набор кавычек.