2015-07-14 3 views
2

Я удивлен, что я ничего не видел об этом здесь (или, может быть, я пропустил это). При анализе CSV-файла, если есть строки без данных, как это сделать/должно быть обработано? Я не говорю о пустых строк, но пустые строки, например:Игнорирование строк CSV без данных

ID,Name,Quantity,Price 
1,Stuff,2,5 
2,Things,1,2.5 
,,, 
,,, 
,,, 

Я использую TextFieldParser обрабатывать запятые в данных, несколько разделителей и т.д. Эти два решения я надумал это либо использование ReadLine вместо ReadFields, но это позволило бы удалить преимущества использования TextFieldParser, я бы предположил, потому что тогда мне пришлось бы обрабатывать запятые по-другому. Другой вариант состоял бы в том, чтобы перебирать поля и отбрасывать строку, если все поля пустые. Вот что у меня есть:

dttExcelTable = new DataTable(); 

using (TextFieldParser parser = new TextFieldParser(fileName)) 
{ 
    parser.Delimiters = new string[] { ",", "|" }; 

    string[] fields = parser.ReadFields(); 
    if (fields == null) 
    { 
     return null; 
    } 
    foreach (string columnHeader in fields) 
    { 
     dttExcelTable.Columns.Add(columnHeader); 
    } 

    while (true) 
    { 
     DataRow importedRow = dttExcelTable.NewRow(); 
     fields = parser.ReadFields(); 
     if (fields == null) 
     { 
      break; 
     } 
     for (int i = 0; i < fields.Length; i++) 
     { 
      importedRow[i] = fields[i]; 
     } 

     foreach (var field in importedRow.ItemArray) 
     { 
      if (!string.IsNullOrEmpty(field.ToString())) 
      { 
       dttExcelTable.Rows.Add(importedRow); 
       break; 
      } 
     } 

    } 
} 

ответ

0

Не похоже, что есть на самом деле лучшее решение, чем тот, который я предоставил. Мне просто нужно будет пропустить все поля и посмотреть, все ли они пусты, прежде чем добавлять их в мой datatable.

Единственное другое решение, которое я нашел, - это ответ Стива, который не должен использовать TextFieldParser

2

Без использования thirdy партии CSV читателя вы можете изменить свой код таким образом

..... 
DataRow importedRow = dttExcelTable.NewRow(); 
for (int i = 0; i < fields.Length; i++) 
    importedRow[i] = fields[i]; 

if(!importedRow.ItemArray.All (ia => string.IsNullOrWhiteSpace(ia.ToString()))) 
    dttExcelTable.Rows.Add(importedRow); 

Используя все IEnumerable расширение, которое вы могли бы проверить каждый элемент ItemArray используя строку. IsNullOrWhiteSpace. Если return true, у вас есть массив пустой строки, и вы можете пропустить Add

0

Вы можете просто заменить запятые в строке ничем и проверить это, если оно равно null.

strTemp = s.Replace(",", ""); 

if (!String.IsNullOrEmpty(strTemp)) { /*code here */} 

http://ideone.com/8wKOVD

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