简体   繁体   English

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

[英]How to skip first line while reading csv using streamreader

I have my following code to read values from CSV file and do some processing.我有以下代码从 CSV 文件中读取值并进行一些处理。 I would like to skip the first row of the input CSV file as it contains header text but I'd want to add it back after the processing is done.我想跳过输入 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());
        }

    }
}

Sample input csv looks like this:示例输入 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

And I'd like to have my output like this:我希望我的输出是这样的:

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

Just read it first before you get into the loop.在进入循环之前先阅读它。 I'd do this:我会这样做:

using (StreamReader sr = new StreamReader(filePath))
{
    string headerLine = sr.ReadLine();
    string line;
    while ((line = sr.ReadLine()) != null)
    {
         ...
    }
}

(I don't like using Peek, personally.) (我个人不喜欢使用 Peek。)

Then when you write out the output, start with headerLine .然后当你写出输出时,从headerLine开始。

Just read the first line and do nothing with it...只需阅读第一行并对其进行任何操作...

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();

        //***//
    }
}

Something like this:像这样的东西:

bool isFirst=true;
using (StreamReader sr = new StreamReader(filePath))
{
    while (sr.Peek() != -1)
    {
        if(isFirst)
        {
            isFirst=false;
            continue;
        }
    }
}

I recommend, to use technique to handle such situation,我建议,使用技术来处理这种情况,

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

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM