【问题标题】:How to skip first line while reading csv using streamreader使用streamreader读取csv时如何跳过第一行
【发布时间】: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

【问题讨论】:

    标签: c# asp.net streamreader


    【解决方案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 循环之前读取第一行并将其存储,或者您可以使用计数器/布尔字段来检查您在文件中的位置。

            【讨论】:

              猜你喜欢
              • 2014-01-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-10-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多