【问题标题】:CSV Helper Convert a scientific notation into String typeCSV Helper 将科学记数法转换为 String 类型
【发布时间】:2020-06-23 15:59:48
【问题描述】:

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

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

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

【问题讨论】:

  • 您应该在此处添加一些代码,以便清楚地知道您的“csv 助手”中出现了哪种语言和哪种问题。如果您不允许共享代码,您可以在此处写下伪代码或示例。还请添加更具体的标签 - 例如language name , "convert", "number", "csv" - "csvhelper" 应作为标签删除,因为与搜索无关(恕我直言)。执行此步骤可以让社区更轻松地为您提供帮助。

标签: csvhelper


【解决方案1】:

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

【讨论】:

  • 有没有办法不用使用地图文件并注册它?因为我目前没有使用它,也不想只为一个属性添加它。如果这是唯一的方法,那么 Map 文件是否可以只有 PhoneNumber 映射而其余属性仍会继续进行自动映射?我在类本身上使用 Name 属性,该属性正在对 csv 中的标题进行自动映射。
  • 我刚刚将答案更新为在TestMap 类中包含AutoMap
【解决方案2】:

TL;DR:这看起来像 Excel 吃掉了你的电话号码数据。它消失了。去源头。


这本身不是一个编程答案,而是更适合您所在的问题空间。在电信计费方面工作过,这个问题的唯一真正解决方案是找到您的数据源,并告知他们已损坏,并让他们使用 Excel 从源重建它,或者至少确保电话号码字段被视为文本。

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

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

【讨论】:

    猜你喜欢
    • 2019-04-21
    • 2023-02-17
    • 2015-07-03
    • 2019-02-25
    • 1970-01-01
    • 2014-09-25
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多