#c# #csv #csvhelper
#c# #csv #csvhelper
Вопрос:
Наш клиент начал сообщать об ошибках при импорте данных из файла CSV. После просмотра csv-файла мы решили переключиться с пользовательского анализатора CSV на CSVHelper, но CSV Helper не может прочитать некоторые допустимые CSV-файлы.
Пользователи могут загружать любой CSV-файл в наше приложение, поэтому мы не можем использовать какой-либо class mapper. Мы используем csv.Parser.Прочитайте, чтобы прочитать потоки данных string[]. Мы не можем изменить способ создания этого файла csv, он создается другой компанией, и мы не можем убедить их изменить генерацию, когда этот файл находится в допустимом формате.
Если мы используем обработчик ошибки при обнаружении данных, то context.RawRecord будет:
"1000084;SMRSTOVACI TRUBICE PBF 12,7/6,4 (1/2") H;"
строка данных в файле csv является:
1000084;SMRSTOVACI TRUBICE PBF 12,7/6,4 (1/2") H;;;ks;21,59;26,46;21.00;;;8591735015183;8591735015183;Technik;Kabelový spojovací materiál;Označování, smršťování, izolace;Bužírky, smršťovačky;
Это должен быть допустимый файл csv по RFC 4180.
Код является:
using (var reader = new StreamReader(filePath, Encoding.Default))
{
using (var csv = new CsvReader(reader))
{
csv.Read();
csv.ReadHeader();
List<string> badRecord = new List<string>();
csv.Configuration.BadDataFound = context => badRecord.Add(context.RawRecord);
header = csv.Context.HeaderRecord.ToList();
while (true)
{
var dataRow = csv.Parser.Read();
if (dataRow == null)
{
break;
}
data.Add(dataRow);
}
}
}
Можете ли вы помочь мне настроить CSVHelper, чтобы иметь возможность загружать эту строку в string[]? Или вы можете предложить другой синтаксический анализ, который сможет это сделать?
Спасибо
Ответ №1:
Я полагаю, что проблема вызвана цитатой в середине строки. Попробуйте настроить конфигурацию так, чтобы кавычки игнорировались.
using (var reader = new StreamReader(filePath, Encoding.Default))
{
using (var csv = new CsvReader(reader))
{
csv.Configuration.Delimiter = ";";
csv.Configuration.IgnoreQuotes = true;
csv.Read();
csv.ReadHeader();
List<string> badRecord = new List<string>();
csv.Configuration.BadDataFound = context => badRecord.Add(context.RawRecord);
header = csv.Context.HeaderRecord.ToList();
while (true)
{
var dataRow = csv.Parser.Read();
if (dataRow == null)
{
break;
}
data.Add(dataRow);
}
}
}
Обновлено для версии 27.2.1
using (var reader = new StreamReader(filePath, Encoding.Default))
{
List<string> badRecord = new List<string>();
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = ";",
Mode = CsvMode.NoEscape,
BadDataFound = context => badRecord.Add(context.RawRecord)
};
using (var csv = new CsvReader(reader, config))
{
csv.Read();
csv.ReadHeader();
header = csv.Context.Reader.HeaderRecord.ToList();
while (csv.Parser.Read())
{
data.Add(csv.Parser.Record);
}
}
}