CSV Helper 将科学记数法转换为字符串类型

CSV Helper Convert a scientific notation into String type

我在具有科学记数法的 csv 文件中有一个 phoneNumber 字段。我需要读取实际文本并将其存储为字符串。

根据其他文档,我能够使用 NumberStyles 将科学记数法转换为 long 类型,但我需要它作为字符串类型。

例如:1.11E+09 应该是“1111111111”而不是 1111111111

我相信您需要使用 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());
    }
}

TL;DR:这看起来 Excel 吃了你的 phone 数字数据。它消失了。去源头。


这本身并不是一个编程答案,而是更适合您所遇到的问题space。从事电信计费工作后,解决此问题的唯一真正方法是找到您的数据,通知他们数据已损坏,并让他们使用 Excel 从源 不使用 重建它,或者至少要确保 phone 数字字段被视为文本。

我之所以这么说,是因为每次我看到这个错误都是因为处理链中某处有人使用 Excel 向某些原始电信交换机数据添加或更新一列信息。这也发生在以各种格式输入 phone 号码的联系人数据中,其中一些是没有其他格式的原始号码(如 (cc)xxx..(npa)nxx-xxxx)。 Excel 对原始 phone 数字过敏,因为它以数字形式看待它们。它将 trim 前导零,如果太长,将转换为科学记数法。

即使您成功将其转换回一个固定整数,您也会丢失 phone 号码中的许多对路由和评级至关重要的相关信息。请注意,1.11e+09 不会转换为 1_111_111_111,而是 1_110_000_000;在任何一种情况下,这些都不是任何交易所中的有效 phone 号码。