使用streamreader读取csv时如何跳过第一行

Posted

技术标签:

【中文标题】使用streamreader读取csv时如何跳过第一行【英文标题】:How to skip first line while reading csv using streamreader 【发布时间】:2012-02-23 23:30:45 【问题描述】:

我有以下代码从 CSV 文件中读取值并进行一些处理。我想跳过输入 CSV 文件的第一行,因为它包含标题文本,但我想在处理完成后将其添加回来。

List<string> values = new List<string>();
using (StreamReader sr = new StreamReader(filePath))

    while (sr.Peek() != -1)
    
        string line = sr.ReadLine();
        List<string> lineValues = line.Split(',').ToList();
        var tempMinInt = 1;
        var tempValue = 1;
        var tempValInt = Convert.ToInt32(lineValues[4]);
        if (lineValues[3] == "1876")
        
            if (tempValInt % 60 != 0)
            
                tempMinInt = (tempValInt / 60) + 1;
                tempValue = tempMinInt * 30;
            
            else
            
                tempMinInt = tempValInt / 60;
                tempValue = tempMinInt * 30;
            
        
        else if (lineValues[3] == "1875")
        
            if (tempValInt != 0)
            
                tempValue = 500;
            
            else
                tempValue = 0;
        

        if (lineValues[3] == "1876")
        
            values.Add(string.Join(",", lineValues) + "," + "0" + "," + "30" + "," + tempValue.ToString());
        
        else if (lineValues[3] == "1875")
        
            values.Add(string.Join(",", lineValues) + "," + "1" + "," + "500" + "," + tempValue.ToString());
        

    

示例输入 csv 如下所示:

id, datetime, msisdn, num, duration
33083,2011-12-19 05:17:57+06:30,98590149,1875,258
33084,2011-12-19 05:22:28+06:30,98590149,1875,69
33085,2011-12-19 05:23:45+06:30,98590149,1875,151
33086,2011-12-19 05:30:21+06:30,98590149,1875,58
33087,2011-12-19 06:44:19+06:30,949826259,1875,66

我想要这样的输出:

id, datetime, msisdn, num, duration, type, ammount, total
33083,2011-12-19 05:17:57+06:30,98590149,1875,258,1,500,500
33084,2011-12-19 05:22:28+06:30,98590149,1875,69,1,500,500
33085,2011-12-19 05:23:45+06:30,98590149,1875,151,1,500,500
33086,2011-12-19 05:30:21+06:30,98590149,1875,58,1,500,500

【问题讨论】:

【参考方案1】:

在进入循环之前先阅读它。我会这样做:

using (StreamReader sr = new StreamReader(filePath))

    string headerLine = sr.ReadLine();
    string line;
    while ((line = sr.ReadLine()) != null)
    
         ...
    

(我个人不喜欢使用 Peek。)

然后当你写出输出时,以headerLine开头。

【讨论】:

【参考方案2】:

只读第一行,什么也不做……

List<string> values = new List<string>();
using (StreamReader sr = new StreamReader(filePath))

    sr.ReadLine();
    while (sr.Peek() != -1)
    
        string line = sr.ReadLine();
        List<string> lineValues = line.Split(',').ToList();

        //***//
    

【讨论】:

【参考方案3】:

类似这样的:

bool isFirst=true;
using (StreamReader sr = new StreamReader(filePath))

    while (sr.Peek() != -1)
    
        if(isFirst)
        
            isFirst=false;
            continue;
        
    

【讨论】:

【参考方案4】:

我建议,使用技术来处理这种情况,

                int row = 0;
                using (StreamReader sr = new StreamReader(filePath))

                
                   While(reader.Read()) //Each row of the file
                    
                        row++;
                        if(row==1)
                        
                            continue;
                        
               
... code..

【讨论】:

【参考方案5】:

您可以在 while 循环之前读取第一行并将其存储,或者您可以使用计数器/布尔字段来检查您在文件中的位置。

【讨论】:

以上是关于使用streamreader读取csv时如何跳过第一行的主要内容,如果未能解决你的问题,请参考以下文章

从串口写入数据时如何跳过第一行?

LOAD DATA LOCAL,如何跳过第一行?

使用 CSV 文件在循环中跳过第一行(字段)? [复制]

numpy loadtxt 跳过第一行

Kettle使用_31 CSV文件输入跳过第一(首)行之过滤记录

OracleDataReader reader.Read() 从第二个记录行开始读取行,跳过第一行记录