2013-01-15 2 views
3

.NETTextFieldParser с полями, заключенная в нечто иное, чем "

С TextFieldParser может назначить разделитель.

Но Прилагаю булево

TextFieldParser.HasFieldsEnclosedInQuotes

Как я могу указать, как ® для

Если ответ состоит в том, чтобы читать каждую строку, а затем разделять, то НЕ предоставлять этот код.
У меня уже есть «ручной» парсер.
Вопрос в том, могу ли я использовать TextFieldParser.

+0

А ... мне потребовалась минута, чтобы понять, что «But Enclosed is boolean» ссылается на свойство HasFieldsEnclosedInQuotes, имеющее логический тип данных (а не текст, заключенный в кавычки, представляющий собой строковое представление булево значение). – JDB

ответ

1

Класс TextFieldParser поддерживает только двойные кавычки (") для включения. Невозможно изменить это.

+0

О, ну, стоило спрашивать. Подождите чудо-ответ, прежде чем дать это чек. – Paparazzi

2

Эта библиотека Fast CSV Reader на CodePlex поддерживает настроенный символ «Quote», который может быть установлен в ®. Вы можете использовать это вместо TextFieldParser, который поддерживает только двойные кавычки для включения записей.

+0

Поскольку мое руководство работает, он просто останется с ним. Отсутствие проблем с производительностью. Я надеялся упростить код. – Paparazzi

1

Вы можете заменить все символы ® символами ", прежде чем звонить TextFieldParser. Либо путем предварительной обработки файла на диске, либо с помощью какой-либо упаковки TextReader. Вот пример, который я написал:

/// <summary> 
/// Wrapping text reader that transforms each line of text with 
/// the supplied deleagte before it is read. 
/// </summary> 
public class TransformingTextReader : TextReader 
{ 
    private readonly TextReader _innerReader; 
    private readonly Func<string, string> _lineTransform; 
    private StringReader _lineReader; 

    public TransformingTextReader(TextReader innerReader, 
     Func<string, string> lineTransform) 
    { 
     _innerReader = innerReader; 
     _lineTransform = lineTransform; 
     _lineReader = new StringReader(string.Empty); 
    } 

    public override int Read() 
    { 
     // Read next character in line 
     var result = _lineReader.Read(); 

     // If end of line (or beginning of stream) 
     if (result == -1) 
     { 
      // Read line from underlying reader 
      var line = _innerReader.ReadLine(); 
      if (line != null) 
      { 
       // Transform the line, and begin reading its characters 
       line = _lineTransform(line) + "\r\n"; 
       _lineReader = new StringReader(line); 
       result = _lineReader.Read(); 
      } 
     } 
     return result; 
    } 

    protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 
     if (disposing) 
     { 
      // Make sure we dispose the underlying reader as well 
      _innerReader.Dispose(); 
     } 
    } 
} 

Это позволит вам сделать что-то вроде следующего:

var fileReader = new StreamReader(path); 
var transformingReader = new TransformingTextReader(fileReader, 
    s => s.Replace('®', '\"')); 
using (var parser = new TextFieldParser(transformingReader) 
{ 
    // Your code 
} 

Update: Вот пример того, как можно использовать TransformingTextReader, чтобы избежать внутренней цитаты (со ссылкой на мой комментарий):

// Use regex to escape quotes not adjacent to a delimiter 
    var pattern = "(?<=[^,])\"{1,2}(?=[^,])"; 
    var replacement = "\"\""; 
    var regex = new Regex(pattern, RegexOptions.Compiled); 
    var transformingReader = new TransformingTextReader(fileReader, 
     s => regex.Replace(s, replacement)); 

конечно, вы можете связать между собой несколько TransformingTextReader экземпляров Пера образуют несколько преобразований. ;-)

+0

Да может заменить «с помощью ®, но причина того, что у некоторых полей есть», как часть поля. Даже «,» могут возникать в поле. – Paparazzi

+1

Да, мне тоже пришлось иметь дело с этим. Вы можете избежать кавычек для парсера, удвоив их, т. Е. '' '' Интерпретируется как литерал '' '. Я обновлю свой пример, чтобы включить пример того, как я использовал свой« TransformingTextReader »для обработки файлов, которые не правильно отмените кавычки. – luksan

+0

Просто разделите каждую строку на ®, ®, затем просто обрезайте ® на первом и последнем языках меньше кода. – Paparazzi

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