2013-08-22 1 views
1

Я использую Microsoft.VisualBasic.FileIO.TextFieldParser, чтобы прочитать файл csv, отредактировать его, а затем проанализировать.Как сохранить кавычки при анализе файла csv?

Проблема заключается в том, что кавычки не сохраняются после разбора.

Я пробовал использовать parser.HasFieldsEnclosedInQuotes = true;, но по некоторым причинам он не сохраняет котировки.

Эта проблема разрывов, когда поле содержит цитату, например: Перед

"some, field" 

После

some, field 

Как два раздельных полей

Вот мой метод

public static void CleanStaffFile() 
    { 
     String path = @"C:\file.csv"; 
     String dpath = String.Format(@"C:\file_{0}.csv",DateTime.Now.ToString("MMddyyHHmmss")); 
     List<String> lines = new List<String>(); 

     if (File.Exists(path)) 
     { 
      using (TextFieldParser parser = new TextFieldParser(path)) 
      { 
       parser.HasFieldsEnclosedInQuotes = true; 
       parser.Delimiters = new string[] { "," }; 

       while (!parser.EndOfData) 
       { 
        string[] parts = parser.ReadFields(); 

        if (parts == null) 
        { 
         break; 
        } 

        if ((parts[12] != "") && (parts[12] != "*,116")) 
        { 
         parts[12] = parts[12].Substring(0, 3); 
        } 
        else 
        { 
         parts[12] = "0"; 
        } 

        lines.Add(string.Join(",", parts)); 
       } 
      } 

      using (StreamWriter writer = new StreamWriter(dpath, false)) 
      { 
       foreach (String line in lines) 
        writer.WriteLine(line); 
      } 

     } 

     MessageBox.Show("CSV file successfully processed :\n"); 
    } 
+0

Если поле квалифицированы в кавычках он рассматривает поле как один элемент данных. Если в котировках части данных вам нужно будет использовать другой текстовый определитель. – Romoku

+1

Есть [много] (http://stackoverflow.com/questions/5865747/parsing-csv-file-enclosed-with-quotes-in-c-sharp) из [этих вопросов] (http: // stackoverflow. com/questions/4000415/parsing-csv-file-with-commas-and-quotes-as-deliminators-pin) – Jonesopolis

+0

Итак, вы хотите иметь кавычки после того, как вы изменили его на 'string.Join (", ", parts) '? Тогда это легко, потому что раньше только поля, содержащие разделитель, были обернуты кавычками. Просто добавьте их еще до 'String.Join'. –

ответ

1

Итак, вы хотите иметь котировки после того, как вы изменили его на string.Join(",", parts)? Тогда это легко, потому что раньше только поля, содержащие разделитель, были обернуты кавычками. Просто добавьте их еще до String.Join.

Так что прежде (и желательно):

"some, field" 

после (не требуется):

some, field 

Это должно работать:

string[] fields = parser.ReadFields(); 
// insert your logic here .... 
var newFields = fields 
    .Select(f => f.Contains(",") ? string.Format("\"{0}\"", f) : f); 
lines.Add(string.Join(",", newFields)); 

Редактировать

Я хотел бы сохранить кавычки, даже если не содержит запятую

Тогда это еще проще:

var newFields = fields.Select(f => string.Format("\"{0}\"", f)); 
+0

Какую логику мне нужно вставить туда? Я хотел бы сохранить цитаты, даже если не содержит запятых, спасибо – meda

+0

@meda: это только часть вас, которую я пропустил. Я должен признать, что я не уверен, чего вы на самом деле пытаетесь достичь. Однако, я думаю, что это не связано с проблемой, как сохранить кавычки, которые были удалены. Итак, '// вставляем вашу логику здесь ...' это то, что начинается с 'if (parts == null)' в вашем коде. ** Отредактировано ** мой ответ в соответствии с «сохранить цитаты, даже если они не содержат кавычек». –

+0

Я хотел сказать, даже если не содержит запятой – meda

0

TextFieldParser.HasFieldsEnclosedInQuotes свойства используются следующим образом, со страницы MSDN:

Если свойство истинно, анализатор предполагает, что поля заключены в кавычках (»«) и может содержать окончания строк.

Если поле заключено в кавычки, например, abc, "field2a,field2b", field3, и это свойство True, тогда весь текст, заключенный в кавычки, будет возвращен как есть; этот пример вернет abc|field2a,field2b|field3. Установка этого свойства в значение False приведет к возврату этого примера abc|"field2a|field2b"|field3.

В кавычках указывается начало и конец поля, которое может содержать символы, используемые для нормального разделения полей. Если у ваших данных есть котировки, вам необходимо установить HasFieldsEnclosedInQuotes в false.

Если ваши поля данных могут содержать как разделители, так и кавычки, вам нужно будет запустить экранирование кавычек перед разбором, что является проблемой. В основном вы выходите за пределы возможностей простого CSV-файла.

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

  • Нет связанных вопросов^_^