2016-03-23 7 views
0

Ich versuche, eine CSV-Datei über LINQ neu anordnen/neu anordnen. Nachdem ich die Anordnung der Spalten berechnet habe, muss ich eine neue CSV-Datei in dieser Anordnung erstellen.Wie konvertiert man eine Zeichenfolge in C# -Code in der SELECT von C# LINQ

Referenz: https://msdn.microsoft.com/en-us/library/bb546155.aspx

ich ähnlichen Code bin mit einer neuen Datei (in diesem Fall: 3 Spalten): schreiben

IEnumerable<string> queryLINQ = 
       from line in lines 
       let x = line.Split(',') 
       select x[3],x[1],x[2]; 

Aber sind die Anzahl Spalten ruhig riesig in der Problem (80) und die Anordnung wird dynamisch empfangen (positionArray []), so dass die Spaltenanordnung nach dem SELECT-Teil in einer Zeichenkette erzeugt wird. 'count' ist die Nummer der Spalte hier.

 string selectCol = ""; 
     for (int k = 0; k < count; k++) 
     { 
      string col; 
      if(k+1<count) 
      { 
       col= "x[" + positionArray[k] + "],"; 
      } 
      else 
      { 
       col= "x[" + positionArray[k] + "]"; 
      } 
      selectCol += piece; 
     } 

Ich bin nicht in der Lage, die ‚selectCol‘ in dem SELECT-Teil zu verwenden, da es die Datei mit dem x genating [somenumber].

Wie konvertiere ich die 'selectCol' Zeichenfolge, so dass es mir das gewünschte Ergebnis gibt?

Gibt es noch eine andere Alternative?

+0

Was sind 'positionArray' und' colPosArr'? –

+0

Die LINQ-Abfrage ist nicht korrekt ('lokale Variable 'x' kann nicht verwendet werden, bevor sie deklariert ist) –

+0

was ist mit Auswahl x [2], x [0], x [1] ;? –

Antwort

1

Ich hoffe, ich verstehe das Problem richtig. Aber hier ist ein anderer Weg zu erreichen, was Sie wollen.

//assuming this is the new order of columns you want 
    int[] positionArray = {2, 1, 0}; 
    string[] lines = System.IO.File.ReadAllLines(@"c:\temp\testcsv.csv"); 

    var newLines = lines.Select(p => 
    { 
    var columns = p.Split(','); 
    var sb = new StringBuilder(); 
    foreach (var i in positionArray) 
    { 
     if (sb.Length > 0) 
     { 
     sb.Append(","); 
     } 
     sb.Append(columns[i]); 
    } 
    return sb.ToString(); 
    }).ToArray(); 

    System.IO.File.WriteAllLines(@"c:\temp\testcsv2.csv", newLines); 
    Console.WriteLine("Spreadsheet2.csv written to disk. Press any key to exit"); 
    Console.ReadKey(); 
+0

Ich mag die Idee (+1), ich antwortete (using 'Linq'_) diesen Ansatz zu erweitern. –

+0

Für vergleichsweise kleinere CSV ist die Ausführung perfekt und ich kann das gewünschte Ergebnis erzielen. Aber da die CSV, die ich verarbeite, riesige (ungefähr 80) Spalten hat, hat die erzeugte Datei die Titelspalte in Ordnung, aber die Datensätze sind durcheinander. Ist es das Problem mit CSV oder muss ich den C# -Code anpassen? – Abhirup

+0

Können Sie ein Beispiel der Datei irgendwo teilen, dann kann ich es betrachten. – Captain0

0

Mit an @ Captain0 (andere Antwort), bekam ich die Linq Ansatz für Sie geben Respekt.

Geben Sie die Reihenfolge der Spalten in der positionArray und Sie erhalten die Reihenfolge der Wünsche.

int[] positionArray = { 2, 1, 0 }; 

var flines = File.ReadAllLines(@"c:\temp\testcsv.csv"); 

var arranged = flines.Select(line => line.Split(',')) 
        .Select(x => string.Join(",", x.Select((s, i) => x[positionArray[i]]))) 
        .ToList(); 

und angeordnet Linien können Sie auf neue Datei mit File.WriteAllLines schreiben.

File.WriteAllLines(@"c:\temp\testcsv2.csv", arranged); 
+0

Das ist sehr hilfreich, aber x [positionArray [i] erzeugt den Fehler "Array out of bound", da i = Anzahl der Arrays. – Abhirup

+0

@Abhirup gibt es ein Problem? Lösung für Sie arbeiten? –

+0

Ich habe gerade überprüft, arbeitet für mich. Stellen Sie sicher, dass PositionArray von '0' index –