2012-02-01 111 views
17

Tengo mi siguiente código para leer los valores del archivo csv y hacer algún procesamiento. Me gustaría omitir la primera fila del archivo csv de entrada, ya que contiene el texto del encabezado, pero me gustaría volver a agregarlo una vez que se haya completado el procesamiento.Cómo omitir la primera línea al leer csv usando el corrector de flujo

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 entrada de la muestra es el siguiente:

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 

y me gustaría tener mi salida como esta:

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 

Respuesta

39

Sólo leyó primero antes de entrar en el bucle . Me gustaría hacer esto:

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

(no me gusta usar Peek, personalmente.)

Entonces, cuando usted escribe la salida, comenzar con headerLine.

1

Puede leer la primera línea antes de su ciclo while y almacenarla, o puede usar un campo contador/booleano para verificar en qué parte del archivo se encuentra.

11

Basta con leer la primera línea y no hacer nada con él ...

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

Algo como esto:

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