2016-04-14 2 views
1

Следуя предыдущей нити Object reference on array with regex.replace()Разбор запятые в поле с TextFieldParser вызывает дополнительный столбец

Я имею в cpath несколько столбцов, которые содержат поля, такие как street,""test,format"", casio. К сожалению,

csvReader.SetDelimiters(new string[] { "," }); 

добавляет пустые дополнительные колонки к DataTablecsvData из-за запятой между test and format. Следовательно, следующий опрос:

Существует ли уловка для удаления запятой от """test,format""", чтобы получить street,""test format"", casio в csvData?

Заранее спасибо

EDIT

private static List<string[]> RemoveComaDataFromCSVFile(string csv_file_path) 
    { 
     List<string[]> allLineFields = new List<string[]>(); 

     try 
     { 
      using (TextReader sr = new StringReader(csv_file_path)) 
      using (TextFieldParser csvReader = new TextFieldParser(csv_file_path)) 
      { 
       csvReader.Delimiters=new[] { "," }; 
       csvReader.HasFieldsEnclosedInQuotes = true; 
       while (!csvReader.EndOfData) 
       { 

        string[] fieldData = csvReader.ReadFields(); 
        string pattern = "\""; 
        string replacement = ""; 
        Regex rgx = new Regex(pattern); 
        //Making empty value as null 
        for (int i = 0; i < fieldData.Length; i++) 
        { 
         //Remove quotation marks on Fields 
         fieldData[i] = Regex.Replace(fieldData[i], pattern, replacement); 
         if (fieldData[i] == "") 
         { 
          fieldData[i] = null; 
         } 
        } 
        //csvData.Rows.Add(fieldData); 
        allLineFields.Add(fieldData); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
     return allLineFields; 
    } 
+1

'TextFieldParser' имеет свойство' HasFieldsEnclosedInQuotes', который вы должны установить в 'true'. Тогда запятая в '' test, format'' не имеет значения. Вы также должны показать код, который генерирует «DataTable». –

+0

@TimSchmelter: потому что я получаю csv 'data', содержащие' coma delimiter' и, к сожалению, я не могу его изменить. однако я никогда не ожидал, что некоторые поля могут содержать ',' messing all up. поэтому я действительно застрял ... –

+0

Вы прочитали остальную часть моего комментария;) 'TextFieldParser' не имеет проблем с запятой, если поле завернуто в кавычки –

ответ

2

TextFieldParser имеет свойство HasFieldsEnclosedInQuotes, который вы должны установить в true. Тогда запятая в «test, format» не имеет значения, потому что она будет интерпретироваться как одно значение.

Пример:

List<string[]> allLineFields = new List<string[]>(); 
string sampleLine = @"street,""test,format"", casio"; 
using (TextReader sr = new StringReader(sampleLine)) 
using (TextFieldParser parser = new TextFieldParser(sr)) 
{ 
    parser.HasFieldsEnclosedInQuotes = true; 
    parser.Delimiters = new[] { "," }; 
    while (!parser.EndOfData) 
    { 
     string[] fields = parser.ReadFields(); 
     allLineFields.Add(fields); 
    } 
} 

Результат один string[] с тремя полями:

[0] {string[3]}  string[] 
    [0] "street"  string 
    [1] "test,format" string 
    [2] "casio"   string 
+0

Спасибо, Тим, попробуем это, надеясь, что он не будет иметь значение для функции 'public static void InsertDataSQLBulkCopy (csvData)', используя эту ' Datable' в качестве аргумента. Best, –

+0

@ dark.vador: это может быть положительным, если «DataTable» содержит правильные данные. Но я не знаю, как вы создаете «DataTable», поэтому может быть проблема. –

+0

уверен, Тим. Спасибо за вашу оперативность и помощь в этом. –

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