2015-10-23 3 views
1

Я ищу, чтобы прочитать CSV в несколько текстовых полей в форме. Каждая строка CSV-файла имеет различное количество столбцов, и мне нужно, чтобы он читал каждую строку CSV отдельно - я не хочу, чтобы пустые значения в конце строки были записаны в текстовые поля. CSV выглядит следующим образом:Чтение CSV строк в несколько текстовых полей в 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,,,,,, 

Все это нужно сделать, это на нажатие кнопки, прочитать каждую строку из значений, разделенных запятыми и поместить каждое из значений в текстовые поля в последовательном порядке. то есть текстовое поле1 = значение CSV 1, текстовое поле2 = значение CSV 2 и т. д.

Форма выглядит как this, каждая строка соответствует строке в CSV.

Это то, что я в настоящее время имею, я никогда не работал с парсером текстовых полей, поэтому это был скорее просто тест, чтобы увидеть, могу ли я заставить его написать одно текстовое поле.

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

Спасибо!

+2

Что именно ваш вопрос? –

+0

Возможно, вам стоит опубликовать это на http://codereview.stackexchange.com/ – BenV

ответ

1

С простыми File и string.Split вы можете прочитать файл csv и получить все поля в строке. Для того, чтобы игнорировать пустые записи, используйте StringSplitOptions.RemoveEmptyEntries

Редактировать
Добавлен обходной вспомогательный метод RemoveEmptyEntriesAtEnd который удаляет пустые строки (пустой, пустой, белый-пространство) на конец массива строк!

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

. Я был бы обеспокоен тем, что 'RemoveEmptyEntries' приведет к смещению пустых значений, как и в строке 4 его данных выборки – Hambone

+0

@Hambone true! Я обновил ответ обходным путем. –

+0

Я получаю эту ошибку: «System.IndexOutOfRangeException», когда я пытаюсь заполнить другие текстовые поля. Например, у меня есть tb1.Text = fields [0]; tb2.Text = поля [1]; tb3.Text = поля [2]. Это правильный способ заполнить каждое текстовое поле? – Michael

Смежные вопросы