首页 > 解决方案 > 使用 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 个字段正确解析为列表,以便对这些值进行一些更新。

提前感谢您的任何帮助。

标签: csvhelper

解决方案


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

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);
    }
}

推荐阅读