使用CsvHelper

时间:2019-07-15 20:25:14

标签: csvhelper

我正在尝试使用CsvHelper读取没有标题的管道分隔文件。我设置了定界符=“ |”,设置了HasHeaderRecord = false,设置了MissingFieldFound = null和IgnoreBlankLines = true。 我注意到我的文件在文件末尾包含一个空行。我的文件包含3列。我创建了一个对象,将所有3的这些值都带有字符串属性。运行代码时,第一个变量包含所有3列,其他2个变量为空。以下是我正在读取的文件的示例:

01001001|0.0|0.1200|
01001003|0.0|0.5000|
01008000|1.0|1.9200|
101384|9999.0|0.1000|
103073|9999.0|0.0730|
103074|9999.0|0.1600|
103491|9999.0|0.1460|

我在摘要中提供了此信息。如果未设置MissingFieldFound,则无法读取文件。我收到以下错误:

“索引为'1'的字段不存在。您可以通过将MissingFieldFound设置为null来忽略丢失的字段。”

        using (var textReader = new StreamReader(@processFileName))
        {
            var reader = new CsvReader(textReader);
            reader.Configuration.Delimiter = "|";

            using (var record = new CsvReader(textReader))
            {
                record.Configuration.HasHeaderRecord = false;
                record.Configuration.MissingFieldFound = null;
                record.Configuration.IgnoreBlankLines = true;
                var result3 = record.GetRecords<ItemFileInfo>().ToList();
            }
        }

  public class ItemFileInfo
  {
      public string ItemCode { get; set; }
      public string OnHand { get; set; }
      public string Weight { get; set; }
  }

我希望能够将3个字段正确地解析为一个列表,以便对这些值进行一些更新。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您需要按索引将列映射到您的类属性。

using (StreamReader reader = new StreamReader(@processFileName))
using (CsvReader csv = new CsvReader(reader))
{
    csv.Configuration.HasHeaderRecord = false;
    csv.Configuration.Delimiter = "|";
    csv.Configuration.RegisterClassMap<ItemFileInfoClassMap>();
    var results = csv.GetRecords<ItemFileInfo>().ToList();
}

public class ItemFileInfo
{
    public string ItemCode { get; set; }
    public string OnHand { get; set; }
    public string Weight { get; set; }
}

public class ItemFileInfoClassMap : ClassMap<ItemFileInfo>
{
    public ItemFileInfoClassMap()
    {
        Map(m => m.ItemCode).Index(0);
        Map(m => m.OnHand).Index(1);
        Map(m => m.Weight).Index(2);
    }
}