【问题标题】:How to read individual columns from CSV file?如何从 CSV 文件中读取单个列?
【发布时间】:2023-01-26 22:02:38
【问题描述】:

假设以下是我的 CSV 文件:

Step,Magnetization,Energy
1,0.009375,12
2,0.009375,12
3,0.009375,12
4,0.009375,12
5,0.009375,12

我想读取文件并创建三个单独的列表或数组。

所以,我写了下面的代码:

class Program
{
    static void Main(string[] args)
    {
        string csvFilePath = @"ising.csv";

        CsvConfiguration myConfig = new CsvConfiguration(CultureInfo.CurrentCulture)
        {
            Delimiter = ","
        };

        using (var reader = new StreamReader(csvFilePath))
        using (var csv = new CsvReader(reader, myConfig))
        {
            List<double> xAxisForSteps = new List<double>();
            List<double> yAxisForMagnetization = new List<double>();
            List<double> yAxisForEnergy = new List<double>();

            while (csv.Read())
            {
                int step = csv.GetField<int>("Step");
                double magnetization = csv.GetField<double>("Magnetization");
                int energy = csv.GetField<int>("Energy");

                xAxisForSteps.Add(step);
                yAxisForMagnetization.Add(magnetization);
                yAxisForEnergy.Add(energy);
            }
        }
    }
}

这给出了以下错误:

An unhandled exception of type 'CsvHelper.ReaderException' occurred in CsvHelper.dll

Additional information: The header has not been read. 
You must call ReadHeader() before any fields can be retrieved by name.

IReader state:

   ColumnCount: 0    
   CurrentIndex: -1    
   HeaderRecord:    

IParser state:

   ByteCount: 0    
   CharCount: 27    
   Row: 1    
   RawRow: 1    
   Count: 3    
   RawRecord:

Step,Magnetization,Energy

如何解决?

编辑:

调用csv.ReadHeader() 后出现以下错误:

An unhandled exception of type 'CsvHelper.ReaderException' occurred in CsvHelper.dll

Additional information: No header record was found.

IReader state:

   ColumnCount: 0    
   CurrentIndex: -1    
   HeaderRecord:  

IParser state:

   ByteCount: 0    
   CharCount: 0    
   Row: 0    
   RawRow: 0    
   Count: 0

   RawRecord:

【问题讨论】:

  • 正如错误所述,csv 文件中的第一行是标题。 CsvHelper 将第一行视为标题,您必须先调用ReadHeader(),然后助手才能检索其后的行。
  • 您是否尝试过错误消息中建议的解决方案? You must call ReadHeader() before any fields can be retrieved by name
  • @Roe,我应该在哪里称呼它?在 while 循环中?
  • 当错误消息中清楚地给出答案时,我感到很惊讶,但如果用户的声誉超过 16K,则更是如此。 :P 你试过Getting Started guide了吗?表头应该只读一次,当然不是每一行都读;那没有意义。
  • @JonasH,是的。我很困惑在哪里调用它。

标签: c# csvhelper


【解决方案1】:

尝试像这样更改您的代码:

List<double> yAxisForEnergy = new List<double>();

if(csv.Read() && csv.ReadHeader()){
    while (csv.Read())

我不清楚为什么你需要 Read 和 ReadHeader,但这至少对我有用。

请注意,这将取决于当前文化,因为并非所有文化都使用 . 作为小数点分隔符。考虑指定 invariantCulture。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2013-03-23
    • 2019-08-15
    • 1970-01-01
    相关资源
    最近更新 更多