使用 CsvHelper 获取列名列表的最佳方法是啥?

Posted

技术标签:

【中文标题】使用 CsvHelper 获取列名列表的最佳方法是啥?【英文标题】:What is the best way to get the list of column names using CsvHelper?使用 CsvHelper 获取列名列表的最佳方法是什么? 【发布时间】:2018-06-26 17:01:24 【问题描述】:

我正在尝试将 CsvHelper 用于项目。我浏览了文档,但找不到使用单一方法读取所有列名的方法。如何使用 CsvHelper 轻松获取所有列标题名称的列表?我目前正在这样做,但我认为有更好的方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CsvHelper;
using System.IO;

namespace Kg

    class Program
    
        static void Main(string[] args)
        
            using (var reader = new StreamReader(@"myfile.csv"))
            
                var csv = new CsvReader(reader);

                csv.Read();                  
                var has_header = true;
                var csv_headers = new List<string>();
                var header_index = 0;
                while (has_header)
                
                    has_header = csv.TryGetField<string>(header_index, out string header_name);

                    if (has_header)
                    
                        header_index += 1;
                        csv_headers.Add(header_name);

                    

                

                Console.WriteLine(csv_headers.Count);

            
        

【问题讨论】:

通常您知道数据代表什么,因此如果您创建一个类来保存导入的数据,CSVHelper 将为您创建类型化对象并将它们放入一个集合中。 据我所知,csv文件的标题只是第一行。 @Plutonix,谢谢,是的,我同意,但是有超过 50 列,我想创建一个可重用的类,我可以通过解析 csv 文件并设置类型来获取标题名称基于每列的前几行。 @derloopkat 是的,并且很容易通过索引(csv[0])获取第一行中存在的列名,但是没有简单的方法来获取列数。 创建一个类——即使有 50 个道具——仍然比读取、解析和猜测数据类型更简单 【参考方案1】:

标头记录在 csv 上下文中。访问前需要事先阅读。

csv.Read();
csv.ReadHeader();
string[] headerRow = csv.Context.HeaderRecord;

【讨论】:

【参考方案2】:

以前的答案可以正常工作,但从 csvhelper 的第 20 版开始,发生了重大变化。现在只需直接从阅读器访问标题记录:

csv.Read();
csv.ReadHeader();
string[] headerRow = csv.HeaderRecord;

【讨论】:

注意:这些是未处理的标头。如果您使用PrepareHeaderForMatch 来调整标题(例如用下划线替换空格),则不会反映在HeaderRecord 列表中。

以上是关于使用 CsvHelper 获取列名列表的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 csvhelper 显示我创建的错误列表

使用 CsvHelper 将 CSV 中的所有值读入列表

CsvHelper 动态列映射

有啥方法可以扩展包含列表的 pandas Dataframe 中的列并从列表值本身中获取列名?

从 pyspark 数据框中获取多个(100+)列的空计数、最小值和最大值的最佳方法

CsvHelper 用引号包裹所有值