2016-05-06 5 views
1

Ich möchte Werte in Spalten trennen. Die 3 Spalten sind: EmployeeId, Name, Gehalt.Getrennte Werte in Spalten

Ich will dont Split-Methode verwenden, so versuche ich, diese stattdessen

private static void Main(string[] args) 
    { 
     List<string> list1= new List<string>(); 
     List<string> list2= new List<string>(); 
     List<string> list3= new List<string>(); 



     var word= ""; 
     using (var rd = new StreamReader(@"C:\xxx.csv")) 
     { 
      while (!rd.EndOfStream) 
      { 

       var line = rd.ReadLine(); 
       for (int i = 0; i < line.Length; i++) 
       { 
        if (line[i] != Convert.ToChar(",")) 
        { 
         word= word+ line[i]; 
        } 
        if (line[i] == Convert.ToChar(",")) 
        { 
         list1.Add(word); 
         word= ""; 
        } 
        if (i == (line.Length - 1)) 
        { 
         list3.Add(word); 
        } 
       } 
      } 
     } 

     Console.WriteLine("Employee ID:"); 
     foreach (var num in list1) 
      Console.WriteLine(num); 

     Console.WriteLine("employeename:"); 
     foreach (var employeename in list2) 
      Console.WriteLine(employeename); 
     Console.WriteLine("Salary"); 
     foreach (var employeesalary in list3) 
     { 
      Console.WriteLine(employeesalary); 
     } 
     Console.ReadKey(); 
    } 

} 
} 

Die Säule employeeSalary korrekt zugewiesen wird, jedoch EmployeeName Spalte erhält alle Werte (falsch) und EmployeeID nichts enthalten. Kann mir jemand helfen, den Fehler zu finden?

+0

Wie wäre es mit 'IndexOf' und' SubString' String-Funktionen? –

+0

Ich muss es mit Schleifen machen, es gibt keinen Weg wie ich es mache? – Eduard

+0

Auch von Ihrem Code aus, sehe ich keinen Ort, an dem Sie die 'columna1'-Liste hinzufügen. –

Antwort

0

Hier ist eine funktionierende Version des Codes. Ich habe einige Kommentare hinzugefügt, die unnötigen Convert.ToChar-Aufrufe entfernt und geschweifte Klammern um Drucke hinzugefügt, genau wie die allgemeine Codebereinigung. Beachten Sie auch das else-if innerhalb der Schleife, da sich einige Situationen gegenseitig ausschließen. Meine Antwort ist inline mit meinen Kommentaren zu Ihrem ursprünglichen Beitrag.

private static void Main(string[] args) 
    { 
     var employeeIDs = new List<string>(); 
     var employeeNames = new List<string>(); 
     var employeeSalaries = new List<string>(); 


     var tmp = ""; 
     using (var rd = new StreamReader(@"values.csv")) 
     { 
      while (!rd.EndOfStream) 
      { 
       var line = rd.ReadLine(); 
       bool isFirstColumn = true;   //Indicates we are looking for first column value at this time 

       for (int i = 0; i < line.Length; i++) 
       { 
        if (line[i] != ',') 
        { 
         tmp = tmp + line[i]; 
        } 
        else if (line[i] == ',') 
        { 
         if (isFirstColumn) 
         { 
          //This is the ID, because isFirstColumn is still set to true 
          employeeIDs.Add(tmp); 
          isFirstColumn = false;  //Next "," separates the name 
         } 
         else 
         { 
          //This is the name, because isFirstColumn is now false 
          employeeNames.Add(tmp); 
         } 

         tmp = ""; 
        } 

        if (i == (line.Length - 1)) 
        { 
         employeeSalaries.Add(tmp); 
         tmp = ""; 
        } 
       } 
      } 
     } 

     Console.WriteLine("Employee ID:"); 
     foreach (var num in employeeIDs) 
     { 
      Console.WriteLine(num); 
     } 

     Console.WriteLine("name:"); 
     foreach (var name in employeeNames) 
     { 
      Console.WriteLine(name); 
     } 

     Console.WriteLine("Salary"); 
     foreach (var salary in employeeSalaries) 
     { 
      Console.WriteLine(salary); 
     } 

     Console.ReadKey(); 
    } 
+0

Ich werde durch diese Antwort erraten, dass mein Code für Sie arbeitete, und dass es wahrscheinlich Hausaufgaben ist ... Ich empfehle Ihnen, den Code zu überprüfen und mit Ihrer Version zu vergleichen, um die Unterschiede zu Ihrem eigenen Vorteil zu verstehen. Wenn Sie meine Antwort als akzeptiert markieren würden, würde ich es begrüßen. Um Variablen zu ändern, habe ich meine Antwort ohne Ihre Variablennamen aktualisiert. – CoolBots

+0

Danke, +1 natürlich ich überprüfe es – Eduard

+0

Dies sind irgendwelche Möglichkeiten, um Werte für absteigend zu bestellen? – Eduard

0

Ich könnte schnell von dieser Lösung verdünnen, wenn ich dies mit einfachen Schleifen und ohne Verwendung von String-Funktionen gefragt.

Verwenden Sie diese Logik innerhalb der While-Schleife, wahrscheinlich möchten Sie möglicherweise List Deklaration vor zu verschieben, während.

bool firstcolumn= false, secondcolumn = false, thirdcolumn= false; 

System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
List<string> list1 = new List<string>(); 
List<string> list2 = new List<string>(); 
List<string> list3 = new List<string>(); 
for (int i = 0; i < line.Length; i++) 
{ 
    if(line[i] != ',' && i != line.Length -1) 
    { 
     sb.Append(line[i]); 
     continue; 
    } 

    if(!firstcolumn) 
    { 
     firstcolumn = true; 
     list1.Add(sb.ToString()); 

    } 
    else if(!secondcolumn) 
    { 
     secondcolumn = true; 
     list2.Add(sb.ToString()); 

    } 
    else 
    { 
     thirdcolumn = true; 
     list3.Add(sb.ToString()); 
    } 

    sb.Clear();  
} 

Arbeiten Demo

+0

Ich kann nicht mit meinem Code bearbeitet werden – Eduard

+0

Was stoppt? Wenn Sie eine gültige Zeichenfolge mit 2 'haben, sollte es funktionieren. Hast du die Demo überprüft? –

1

Ich weiß, Sie fragte nicht .Split(...) zu verwenden, aber warum nicht? Ihr Code könnte wie folgt aussehen:

string[][] data = 
    File 
     .ReadAllLines(@"C:\xxx.csv") 
     .Select(line => line.Split(',')) 
     .ToArray(); 

List<string> list1 = data.Select(line => line[0]).ToList(); 
List<string> list2 = data.Select(line => line[1]).ToList(); 
List<string> list3 = data.Select(line => line[2]).ToList(); 
Verwandte Themen