【问题标题】:Problem reading pipe delimited file using CsvHelper使用 CsvHelper 读取管道分隔文件时出现问题
【发布时间】:2019-07-15 20:25:14
【问题描述】:

我正在尝试使用 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 个字段正确解析为一个列表,以便我可以对这些值进行一些更新。

提前感谢您的任何帮助。

【问题讨论】:

  • 文件格式为0100100|0.0|0.1200|每行三个记录。抱歉剪切和粘贴

标签: csvhelper


【解决方案1】:

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

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

【讨论】:

  • 感谢大卫的回复。我尝试移除尾管,用尾管向我的模型添加了一个额外的文件。没有一个工作,所以我仍然有同样的问题。
  • 这就是我在没有实际运行的情况下回答的结果。我用适合您的解决方案更新了我的答案。如果每行都有尾管,它也可以工作。
  • 非常感谢大卫。我从来没有在没有测试的情况下进行过更改,哈哈。我实施了您的更改,但仍然收到错误消息。好的一面是它是一个不同的错误:)错误是{“索引'1'的字段不存在。您可以通过将 MissingFieldFound 设置为 null 来忽略丢失的字段。”} 我检查了我的文件并填充了所有字段。最后我确实有一个空行,所以我添加了 IgnoreBlankLines = true;设置。
  • 去掉末尾的空行或者设置IgnoreBlankLines = true是否有效?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-04
  • 2020-08-14
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
相关资源
最近更新 更多