2014-12-22 2 views
1

У меня есть следующий сегмент кода для чтения csv-файла. У меня проблемы с линиями чтения, которые не являются стандартными. Например, линия, какC# textFieldParser error

105,"XXX Bank Azerbaijan" CJSC,1078  ,AZ,Baku,"xxx street",Nasimi district 

переходит в поле поймать, так как во втором поле «XXX Банк Азербайджана» ЗАО имеет котировки не прямо рядом с запятыми. Однако, когда я открываю этот файл в Excel, он не имеет каких-либо проблем и разделяет поля правильно, как:

105|XXX Bank Azerbaijan CJSC|1078|AZ|Baku|xxx street|Nasimi district 

где я | в качестве разделителя столбцов. Есть ли способ получить тот же эффект, используя TextFieldParser, иначе мне понадобится использовать другой csv-ридер.

using (TextFieldParser parser = new TextFieldParser(fileName, Encoding.GetEncoding("windows-1252"))) 
    { 
      parser.TextFieldType = FieldType.Delimited; 
      parser.SetDelimiters(","); 
      parser.TrimWhiteSpace = true; 
      parser.HasFieldsEnclosedInQuotes = true; 

      parser.ReadLine(); // Reads dummy header 

      while (!parser.EndOfData) 
      { 
       try 
       { 
        string[] fieldRow = parser.ReadFields(); 
        T fieldsClass = new T(); 
        fieldsClass.Initialize(fieldRow); 
        data.Add(fieldsClass); 
        rowCount++; 
       } 
       catch 
       { 
        Console.WriteLine("Skipping line" + parser.ErrorLine); 
       } 

      } 
} 
+2

«Не удалось прочитать», что означает исключение, или включает в себя кавычки, которые вы не хотите включать, пропускает строку? – artm

+0

Отредактировано не прочитано, как попадает в поле catch – adam

+0

Я думаю, что ваш парсер уже не сможет разобрать запятую в строке. Ожидаемое поведение '' Foo, Bar "', вероятно, не '' Foo | Bar "'? –

ответ

0

Во-первых, если это на самом деле неправильно отформатированные данные, то вам лучше всего будет делать то, что предложил Ханс Passant и:

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

Однако, если это правильно отформатировано в соответствии с любыми спецификациями, которые были согласованы в обратном порядке, тогда вы можете попробовать установить парсер.HasFieldsEnclosedInQuotes = false; Это заставит его разобрать, но он не будет выделять двойные кавычки, как в вашем примере excel import. Это также заставит textfieldparser анализировать «foo, bar» как «foo» и «bar» вместо «foo, bar» (одно поле). Это можно обойти, указав другой разделитель, который будет использоваться источником данных, который не будет найден в середине значений поля.

Возможно, будет проще изменить спецификации для использования | как разделитель полей, а не для двойных кавычек в каждом поле по сравнению с изменением спецификаций, чтобы разрешать двойные кавычки непосредственно перед и после разделителя полей.

+0

Excel открывает этот файл и отделяет его правильно, поэтому он не отформатирован в соответствии с Excel. – adam

+0

Не имеет значения, сможет ли его открыть или нет. Если формат соответствует тому, что было согласовано до начала этого проекта, то он правильно отформатирован. Если это не так, это не так. К сожалению, насколько я знаю, TextFieldParser не справляется с этим так, как вы ожидали. Если вы хотите использовать TextFieldParser, вам нужно отформатировать данные таким образом, чтобы они могли его прочитать или создать собственный синтаксический анализатор. Если вы знаете, что никакое текстовое поле не будет содержать запятую, вы можете просто отключить HasFieldsEnclosedInQuotes. –