2016-03-23 1 views
0

J'essaie de réorganiser/réorganiser un fichier csv via LINQ. Après avoir calculé l'agencement des colonnes, j'ai besoin de créer un nouveau fichier csv dans cet arrangement.Comment convertir une chaîne en code C# dans le SELECT de C# LINQ

Référence: https://msdn.microsoft.com/en-us/library/bb546155.aspx

J'utilise un code similaire pour écrire un nouveau fichier (dans ce cas: 3 colonnes):

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

Mais, les colonnes sont calmes énormes Nbr dans la problème (80) et l'arrangement est reçu de manière dynamique (positionArray []) de sorte que l'arrangement de colonne après la partie SELECT est généré dans une chaîne. 'count' est la colonne no.of ici.

 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; 
     } 

Je ne suis pas en mesure d'utiliser le « selectCol » dans la partie SELECT comme il est genating le fichier avec les x [someNumber]. Comment convertir la chaîne 'selectCol' pour qu'elle me donne le résultat souhaité?

Existe-t-il une autre alternative à cela?

+0

Que sont 'positionArray' et' colPosArr'? –

+0

La requête LINQ n'est pas correcte ('Impossible d'utiliser la variable locale 'x' avant qu'elle ne soit déclarée') –

+0

qu'en est-il de select x [2], x [0], x [1] ;? –

Répondre

1

J'espère que je comprends le problème correctement. Mais voici une autre voie de réaliser ce que vous voulez.

//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

J'aime l'idée (+1), j'ai répondu (_using 'Linq'_) en étendant cette approche. –

+0

Pour un CSV relativement plus petit, l'exécution est parfaite et je suis capable d'obtenir le résultat désiré. Mais comme le CSV que je suis en train de traiter est énorme (environ 80) colonnes, le fichier en cours de génération a la colonne d'en-tête correct mais les enregistrements sont mélangés. Est-ce le problème avec CSV ou ai-je besoin de personnaliser le code C#? – Abhirup

+0

Pourriez-vous partager un exemple du fichier quelque part, alors je peux le regarder. – Captain0

0

de donner ce qui concerne @ Captain0 (autre réponse), je suis l'approche Linq pour vous.

Spécifiez l'ordre des colonnes dans le positionArray et vous obtenez l'ordre de désir.

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

Et disposées lignes vous pouvez écrire à nouveau fichier en utilisant File.WriteAllLines.

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

Ceci est vraiment utile, mais x [positionArray [i] génère l'erreur "Array out of bound" comme i = count of array. – Abhirup

+0

@Abhirup y a-t-il un problème? solution qui fonctionne pour vous? –

+0

Je viens de vérifier, travaille pour moi. assurez-vous que postionArray commence à partir de l'index '0'. –