【问题标题】:CSV Helper how to read csv file with several header linesCSV Helper 如何读取带有多个标题行的 csv 文件
【发布时间】:2020-02-27 15:15:52
【问题描述】:

我正在使用 CsvHelper 编写一个 csv 文件,该文件具有多个标题行,位于不同的位置(标题具有一定数量的列,但名称不同)。每个表头后面的行数不同。

是否有可能使用 CsvHelper 查找/迭代 csv 文件中的不同标题行(可能通过搜索标题列的名称或部分名称)并迭代读取每个标题后的记录?

【问题讨论】:

  • 您能否将 CSV 文件拆分为多个文件,每个文件都有一个标题?
  • 这当然是可能的,但是我会从头开始写几个文件而不是一个。但是这个想法是只使用一个csv文件,因为所有的标题都有一些结构。只是表头列的名称和每个表头后面的行数不同。
  • 好吧,几个文件将是“以干净的方式做”的非超凡。如果您不希望目录中的多个文件杂乱无章,可以将它们捆绑在一个 zip 中?

标签: c# .net csv header csvhelper


【解决方案1】:

您必须手动执行此操作,逐行阅读并决定您要做什么。

举个例子:

CSV 文件:

测试1、测试2、测试3

A,1,foo

TestA、TestB、Test3

B,07a0fca2-1b1c-4e44-b1be-c2b05da5afc7,bar

void Main()
    {
        using (var reader = new StreamReader("path\\to\\file.csv"))
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            csv.Configuration.HasHeaderRecord = false;
            csv.Configuration.RegisterClassMap<FooMap>();
            csv.Configuration.RegisterClassMap<BarMap>();
            var fooRecords = new List<Foo>();
            var barRecords = new List<Bar>();
            while (csv.Read())
            {
                switch (csv.GetField(0))
                {
                    case "A": // Or "Test1"
                        ...
                        break;
                    case "B": // Or "TestA"
                        ...
                        break;
                    default:
                        throw new InvalidOperationException("Unknown record type.");
                }
            }
        }
    } 

示例和文档: Reading Multiple Record Types

【讨论】:

  • 感谢您的链接,这很有帮助。我必须进行一些更改才能读取所有记录,直到确定下一个标题行。另一个问题是我的 csv 文件有 2 个固定列和一些从列表生成的动态列。如果行结构不能映射到固定结构,样本将如何变化?
  • 动态记录 = csv.GetRecords(); Dynamic Records
猜你喜欢
  • 2016-12-21
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多