2015-10-23 1 views
1

Je cherche à lire un fichier CSV dans plusieurs zones de texte dans un formulaire. Chaque ligne du fichier CSV a un nombre différent de colonnes et j'en ai besoin pour lire chaque ligne du CSV séparément - Je ne veux pas que les valeurs vides à la fin de la ligne soient écrites dans des zones de texte. Le CSV ressemble à ceci:Lecture CSV ligne par ligne dans plusieurs zones de texte en C#

M,7,2,2,0,0,0,0,0,0,0,0,1,0,300,0.07 
f,,0,f,0,395,1,f,t,f,,,,,, 
DATA/BMP99_15.BIN,,,,,,,,,,,,,,, 
,5,,0,,0,0,0,0,0,0,0,0,0,, 
12,1,1,ATM,,,,,,,,,,,, 
0.0315,0,180,0,0,0,0,0,,,,,,,, 
1,2,181,0,,,,,,,,,,,, 
47.5,352,0,0,12,180,0,0,,,,,,,, 
250,2215,15,30,T,N,W,1,A,A,,,,,, 

Tout ce qu'il a à faire est sur un bouton clic, lisez chaque ligne des valeurs séparées par des virgules et mettre chacune des valeurs dans les zones de texte dans un ordre séquentiel. c'est-à-dire textbox1 = valeur CSV 1, textbox2 = valeur CSV 2 et ainsi de suite.

Le formulaire ressemble à this, chaque ligne correspondant à une ligne dans le fichier CSV.

C'est ce que j'ai actuellement, je n'ai jamais travaillé avec l'analyseur de champ de texte, donc c'était plus juste un test pour voir si je pouvais l'obtenir pour écrire une seule boîte de texte.

private void buttonreadcsv_Click(object sender, EventArgs e) 
    { 
     TextFieldParser parser = new TextFieldParser(@"C:\Filepath\inputtest1.csv"); 
     parser.SetDelimiters(","); 
     while (!parser.EndOfData) 
     { 
      string[] fields = parser.ReadFields(); 
      tbmodel.Text = fields[0]; 
     } 

Merci!

+2

Quelle est exactement votre question? –

+0

Peut-être que vous devriez le signaler à http://codereview.stackexchange.com/ – BenV

Répondre

1

Avec simple File lire et string.Split vous pouvez lire un fichier CSV, et obtenir tous les champs par ligne. Pour ignorer les entrées vides, utilisez StringSplitOptions.RemoveEmptyEntries

Modifier
Ajout d'une méthode de contournement aide RemoveEmptyEntriesAtEnd qui supprime des chaînes vides (null, vide, espace blanc) à la fin d'un tableau de chaînes!

var rows = File.ReadAllLines("C:\YourDirectory\data.csv"); //get all rows/lines 
foreach(var row in rows) 
{ 
    //string[] fields = RemoveEmptyEntriesAtEnd(row.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)); 
    string[] fields = RemoveEmptyEntriesAtEnd(row.Split(',')); 
    tbmodel.Text = fields[0]; //and other models..... 
    tbmodelN.Text = fields.Length > N ? fields[N] : string.Empty; //when using N-th index of field 
} 

//The helper method 
public static string[] RemoveEmptyEntriesAtEnd(string[] strArray) 
{ 
    var arrRev = strArray.Reverse(); 
    var emptyEntriesAtEnd = 0; 
    foreach (var item in arrRev) 
    { 
     if (string.IsNullOrWhiteSpace(item)) 
      emptyEntriesAtEnd++; 
     else 
      break; 
    } 
    return arrRev.Skip(emptyEntriesAtEnd).Reverse().ToArray(); 
} 
+0

Je serais préoccupé par le fait que 'RemoveEmptyEntries' provoquerait le décalage des valeurs vierges, comme celles de la ligne 4 de ses données d'échantillon – Hambone

+0

@Hambone true! J'ai mis à jour la réponse avec une solution de contournement. –

+0

Je reçois cette erreur: 'System.IndexOutOfRangeException' lorsque j'essaie de remplir d'autres zones de texte. Par exemple, j'ai tb1.Text = fields [0]; tb2.Text = champs [1]; tb3.Text = champs [2]. Est-ce la bonne façon de remplir chaque zone de texte? – Michael