CSV Helper Преобразование научного представления в строковый тип

У меня есть поле phoneNumber в файле CSV с научным обозначением. Мне нужно прочитать фактический текст и сохранить его как строку.

Из другой документации мне удалось преобразовать научную нотацию в длинный тип, используя NumberStyles, но мне это нужно как строковый тип.

Пример: 1.11E + 09 должно быть 1111111111 вместо 1111111111.


person Sai Krishna    schedule 23.06.2020    source источник
comment
Вы должны добавить сюда код, чтобы было понятно, на каком языке и какие проблемы возникают в вашем помощнике csv. Если вам не разрешено делиться кодом, вы можете записать здесь псевдокод или пример. Также добавьте более конкретные теги - например, имя языка, преобразование, число, csv - csvhelper следует удалить как тег, потому что он не актуален для поиска (IMHO). Выполнение этих шагов значительно облегчит сообществу помощь вам.   -  person de-jcup    schedule 24.06.2020


Ответы (2)


Я считаю, что вам нужно будет использовать ConvertUsing, чтобы получить это.

public class Program
{
    static void Main(string[] args)
    {
        using (var stream = new MemoryStream())
        using (var writer = new StreamWriter(stream))
        using (var reader = new StreamReader(stream))
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        using(var csvWriter = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
        {
            writer.WriteLine("Id,PhoneNumber");
            writer.WriteLine("1,1.11E+09");
            writer.Flush();
            stream.Position = 0;

            csv.Configuration.RegisterClassMap<TestMap>();

            var records = csv.GetRecords<Test>().ToList();
        }
    }
}

public class Test
{
    public int Id { get; set; }
    public string PhoneNumber { get; set; }
}

public sealed class TestMap : ClassMap<Test>
{
    public TestMap()
    {
        AutoMap(CultureInfo.InvariantCulture);
        Map(m => m.PhoneNumber).ConvertUsing(row => decimal.Parse(row.GetField<string>("PhoneNumber"), NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint).ToString());
    }
}
person David Specht    schedule 23.06.2020
comment
Есть ли способ обойтись без использования файла карты и его регистрации? Поскольку в настоящее время я не использую это и не хочу добавлять это только для одного свойства. Если это единственный способ, может ли файл карты иметь только карту PhoneNumber, а остальные свойства по-прежнему будут выполнять автоматическую карту? Я использую атрибут Name в самом классе, который выполняет автоматическое сопоставление заголовков в csv. - person Sai Krishna; 23.06.2020
comment
Я только что обновил ответ, включивAutoMap в класс TestMap. - person David Specht; 24.06.2020

TL; DR: похоже, что Excel съел данные вашего номера телефона. Его больше нет. Перейти к источнику.


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

Я говорю это, потому что каждый раз, когда я видел эту ошибку, это происходит потому, что кто-то где-то в цепочке обработки использовал Excel для добавления или обновления столбца информации к необработанным данным коммутатора телефонной компании. Это также происходит с контактными данными, где номера телефонов были введены в различных форматах, некоторые из них представляют собой необработанные числа без другого форматирования (например, (cc)xxx.. или (npa)nxx-xxxx). У Excel аллергия на необработанные телефонные номера, потому что он видит их в числовом виде. Он обрежет ведущие нули и, если он будет слишком длинным, преобразуется в экспоненциальную нотацию.

Даже если вам удастся преобразовать это обратно в плоское целое число, вы потеряете много важной информации в номере телефона, которая имеет решающее значение для маршрутизации и оценки. Обратите внимание, что 1.11e+09 не преобразуется в 1_111_111_111, а 1_110_000_000; в любом случае ни один из этих телефонных номеров не является действительным при любом обмене.

person Marc L.    schedule 24.06.2020