【问题标题】:Csvhelper not parsing correctly to listCsvhelper 未正确解析以列出
【发布时间】:2017-01-28 03:04:22
【问题描述】:

我正在尝试使用 CSVHelper 将提供的 CSV 文本读入列表,但它会跳过一些记录。

我将下图中的记录设置为红色,以便更清楚地说明我的问题,它只将那些红色字段(总共 52 个)添加到列表中,而不是后面的逗号分隔文本,例如:488273,1482, 14526113。它添加了第一个,但跳过了 1482 和 14526113。我也需要添加这些。

代码

csv.Configuration.HasHeaderRecord = false;
csv.Configuration.TrimFields = false;

List<int> playerInfo = csv.GetRecords<int>().ToList();

图片

红色标记不仅是那些,而且举个例子,它是关于所有第一条记录。

【问题讨论】:

    标签: c# csv csvhelper


    【解决方案1】:
    using System;
    using System.Collections.Generic;
    using System.IO;
    using CsvHelper;
    
    namespace stack1
    {
        class Program
        {
            static void Main(string[] args)
            {
                //list of int
                var result = new List<int>();
                //total 
                int sum=0;
                int recordValue;
                using (TextReader fileReader = File.OpenText(@"C:\sample.csv"))
                {
                    var csv = new CsvReader(fileReader);
                    csv.Configuration.HasHeaderRecord = false;
                    csv.Configuration.TrimFields = false;
    
                    while (csv.Read())
                    {
                        for (var i = 0; csv.TryGetField(i, out recordValue); i++)
                        {
                            result.Add(recordValue);
                            sum += recordValue;
                        }
                    }
                }
                Console.WriteLine(sum);
                Console.ReadLine();
            }
        }
    }
    

    【讨论】:

    • 这不是我的解决方案
    • 你到底想从那个 csv 文件中得到什么?
    • 取不到逗号(,)后的最后两条记录。示例:487207,1484,15047920。从那些它只将 487207 添加到列表中。但我还需要将 1484 和 15047920 添加到列表中。 getRecords 没有正确地做到这一点。
    • 我已经用上面的示例代码进行了验证。您能否检查一下您的 CSV 文件格式。如果您使用我的代码,还请告诉我输出是什么。
    • 结果是只返回前两个。示例行:468709,1526,16860019 636178,70,743222 386482,80,2072114 现在它只返回 468709 和 1526 作为单独的 List 项。可能是我的 csv 格式不正确吗?
    【解决方案2】:

    当您调用csv.GetRecords&lt;T&gt;()CSVHelper 时,将整个每一行(行)映射到指定的类型。您正在映射到类型 int。 CSV 的每一行都有 3 个值。这 3 个值不能映射到单个 int。 CSVHelper 只是映射每行中的第一条记录。

    如果您想使用 CsvReader,您应该定义一个自定义类(具有 3 个 int 属性)并使用csv.GetRecords&lt;MyCustomCsvClass&gt;()。您可能还希望/需要创建自定义 CsvClassMap。 CSVHelper 文档非常棒:Mapping By Index

    或者,您可以使用不进行映射或类型转换的CsvParser class。它只是为每一行返回一个string[]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多