Разобрать csv в десятичное на разных культурах, используя CsvHelper в c # - PullRequest
0 голосов
/ 09 марта 2019

Проблема с анализом десятичных чисел с помощью CsvHelper в c #.

Я создал класс, который получает CSV-файл из байта [] вместо файла, и он работает правильно.

public static List<Topic> GetAll(byte[] attachmentBytes)
    {
        using (Stream stream = new MemoryStream(attachmentBytes))
        {
            using (var reader = new StreamReader(stream, Encoding.GetEncoding(1252), true))
            {
                using (var csv = new CsvReader(reader))
                {
                    csv.Configuration.Delimiter = ";";
                    csv.Configuration.HasHeaderRecord = true;
                    csv.Configuration.CultureInfo = CultureInfo.InvariantCulture;

                    return csv.GetRecords<Topic>().ToList();
                }
            }
        }
    }

Как и выМожно видеть, что я добавил класс для сопоставления CSV с объектом:

public class Topic
{
    [Name("ID")]
    public int Id { get; set; }

    [Name("description")]
    public string Description { get; set; }

    [Name("DecimalPTS")]
    public decimal? DecimalPts { get; set; }
}

И вот так выглядит мой пример данных CSV.

ID;description;DecimalPTS
1;singing;0,6
2;speaking;2,6
3;working;3,3

Но это решение выдает ошибку с

CsvHelper.TypeConversion.TypeConverterException : The conversion cannot be performed.
    Text: '0,6'
    MemberType: System.Nullable`1[[System.Decimal, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

Когда я заменил, просто сделайте Replace (',', '.');на входе, локальный тестовый прохождение, но на моем сервере тестирование не проходит (кажется, что у меня другая культура локально и на сервере)

Что я пытался решить эту проблему:

  • Я добавил csv.Configuration.CultureInfo = CultureInfo.InvariantCulture;
  • Я использовал 7.1.1 CSV Version, но изменил на 12.1.2, и все еще та же ошибка

К сожалению, ничего не помогло.

1 Ответ

0 голосов
/ 09 марта 2019

Попробуйте установить свою культуру на de-DE

csv.Configuration.CultureInfo = new CultureInfo("de-DE");

Вы можете сделать еще один трюк, если ваше приложение работает на

  • локально, тогда вы можете установить культуру на en-US, и если она на
  • сервер, тогда вы можете установить культуру на de-DE.

или наоборот.

Демо-версия:

var bytes = File.ReadAllBytes(@"Path to your csv file");    
List<Topic> list = GetAll(bytes);

//Print list item to console
foreach (var item in list)
{
    Console.WriteLine($"ID: {item.Id}\t Description: {item.Description}\t DecimalPTS: {item.DecimalPts}");
}

Выход:

enter image description here

...