如何在c#中正确获取csv文件头?为同一代码获得不同的结果

如何在c#中正确获取csv文件头?为同一代码获得不同的结果,c#,csv,filereader,C#,Csv,Filereader,我想从csv文件(我在其他帖子中看到FileHelpers应该是好的,但在我的情况下它不是一个选项…)中提取标题数据(要清楚:我指的是包含列名的文件的第一行),它可以工作,但我仍然有问题 我想读取以下格式的文件(很抱歉格式不好,我不知道如何在这里使它更漂亮): 我使用以下代码来实现这一点: string [] csvHeader; using (CsvReader csv = new CsvReader(file.OpenText(), true, ',')) { if (!csv.Get

我想从csv文件(我在其他帖子中看到FileHelpers应该是好的,但在我的情况下它不是一个选项…)中提取标题数据(要清楚:我指的是包含列名的文件的第一行),它可以工作,但我仍然有问题

我想读取以下格式的文件(很抱歉格式不好,我不知道如何在这里使它更漂亮):

我使用以下代码来实现这一点:

string [] csvHeader;
using (CsvReader csv = new CsvReader(file.OpenText(), true, ','))
{
   if (!csv.GetFieldHeaders().Any())
       throw new Exception("header of file empty \n" + file.FullName);
                                    
   csvHeader = csv.GetFieldHeaders()[0].ToString().Split(',');
   if (!CompareArrays(csvHeader, expHeaderFormat))
       throw new MalformedCsvException("Csv Headers don't match! \n CsvHeader: " + csvHeader.ToString() + "\n Expected format: " + expHeaderFormat.ToString());
}
现在我的问题是:

  • 为什么在检索标头时需要获取第一个元素“[0]”?这对我来说毫无意义

  • 对我来说,在另一个文件上尝试它时,只对一个文件有效。在我看来,另一个文件的格式完全相同。当我访问[0]时,我会得到头的第一个元素。这是我期望的行为,但由于某种原因,现在我无法读出整个标题
  • 为什么不能执行以下操作来检索整个第一行,因为根据文档“GetFieldHeaders()”返回一个字符串数组,所以对我来说是有意义的:

    csvHeader =csv.GetFieldHeaders().ToString().Split(',');
    
  • 我希望有足够多的人继续抓住我的问题

    编辑:我正在使用以下库

    using CsvFile;
    using LumenWorks.Framework.IO.Csv;
    
    请注意,该库现在已经很旧了,但它仍然可以使用那里的示例代码:

    using System.IO;
    using LumenWorks.Framework.IO.Csv;
    void ReadCsv()
    {
        // open the file "data.csv" which is a CSV file with headers
        using (CsvReader csv =
               new CsvReader(new StreamReader("data.csv"), true))
        {
            int fieldCount = csv.FieldCount;
    
            string[] headers = csv.GetFieldHeaders();
            while (csv.ReadNextRecord())
            {
                for (int i = 0; i < fieldCount; i++)
                    Console.Write(string.Format("{0} = {1};",
                                  headers[i], csv[i]));
                Console.WriteLine();
            }
        }
    }
    
    使用System.IO;
    使用LumenWorks.Framework.IO.Csv;
    void ReadCsv()
    {
    //打开文件“data.csv”,这是一个带有标题的csv文件
    使用(CsvReader csv)=
    新的CsvReader(新的StreamReader(“data.csv”),真)
    {
    int fieldCount=csv.fieldCount;
    string[]headers=csv.GetFieldHeaders();
    而(csv.ReadNextRecord())
    {
    对于(int i=0;i
    为什么在检索标头时需要获取第一个元素“[0]”?这对我来说毫无意义

    注释中有一些关于文件的整个第一行如何进入数组0的闲聊。我不确定这怎么可能,因为:

    • 您已经在问题中粘贴了一个文件示例,它确实包含逗号
    • csv代表逗号分隔的值
    • 默认情况下,csv阅读器使用逗号作为拆分器
    我预测csv阅读器不会在逗号上拆分第一行的唯一方法是:

    • 第一行以“或其他引号字符开头,因此被视为单个值->文件已损坏,请修复文件或更改读取器使用的引号字符
    • 该文件不使用真正的ascii逗号作为分隔符,但可能使用其他看起来像逗号的Unicode字符;修复该文件或为读取器指定实际分隔符
    • 读卡器库在默认情况下不使用逗号拆分(很难相信),因此在csv读卡器的构造函数中,在True之后指定逗号
    对我来说,在另一个文件上尝试时,只对一个文件有效。在我看来,另一个文件的格式完全相同。当我访问[0]时,我会得到头的第一个元素。这是我预期的行为,但由于某种原因,我现在无法读取整个头

    你需要向我们展示这些文件的截图,在十六进制编辑器中打开,这样我们就可以告诉你。这将是我在上面给出的原因之一。现在我们得到的只是你的话,这些文件在你看来是一样的;向我们展示真实的文件,这样我们就可以独立进行评估

    您抱怨无法获取所有标题,但如果您仅选择第一个带有[0]的标题,则永远无法获取所有标题-库将返回所有标题,您选择只记住一个标题,而将其余标题丢弃

    你正在做一些奇怪的调试代码,比较数组等等,这是你不需要的;所有这些检查都可以在调试器中完成,使用我在上面发布的代码,这些代码是由编写库的人编写的——这是正确的

    你正在从一些示例网站上提取一些代码片段,这些代码是由不同的人在不同的场景下编写的,不能保证与你的场景相同-它们可能会在标签页上拆分,或者有奇怪的引号字符等等。你看不到他们正在阅读的文件,只能看到他们编写的代码。我们应该省去所有这些好的,看看你正在阅读的文件,让它适合你的场景,而不是他们的场景

    为什么不能执行以下操作来检索整个第一行,因为根据文档“GetFieldHeaders()”返回一个字符串数组,所以对我来说是有意义的:

    csvHeader =csv.GetFieldHeaders().ToString().Split(',');
    
    csvHeader=csv.GetFieldHeaders().ToString().Split(',')


    因为这在星期天的一个月内永远不会起作用。GetFieldHeaders返回一个字符串数组作为标头。在字符串数组上调用ToString将给出对象的类型,在本例中为“System.String[]“,它不包含标题和逗号,所以用逗号拆分它是完全无用的,而且是错误的

    您想要数组还是字符串?我正在尝试将标题字段保存到我的字符串数组
    csvHeader=csv.GetFieldHeaders()?我不确定您使用的是什么库,但是
    GetFieldHeaders
    方法返回一个列表或数组或其他东西是有意义的。只要分配它,如果它是另一种
    IEnumerable
    调用
    .GetFieldHeaders().ToArray()
    你正在使用的库的文档在哪里?我猜这个库正在寻找一个不同的定界器,而不是
    。也许你应该试试CsvHelper,图书馆,至少很容易找到它的文档谢谢你详细的回答并指出,图书馆有些过时了!我将尝试更新问题,并尝试您的建议