CSVHelper BadDataFound в допустимом формате csv

#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);
        }
    }
}