2013-01-15 59 views
3

.NETTextFieldParser隨着其他東西比「

隨着TextFieldParser可以指定分隔符圈地。

但附上布爾

TextFieldParser.HasFieldsEnclosedInQuotes

如何指定像®爲

如果答案是要讀取每一行然後拆分,那麼不要提供該代碼
我已經有了一個「手動」解析器。
我的問題是如果我可以使用TextFieldParser。

+0

啊...花了一分鐘才明白,「但Enclosed是布爾值」是指具有布爾型數據類型的'HasFieldsEnclosedInQuotes'屬性(而不是引號內的文本是字符串表示形式一個布爾值)。 – JDB

回答

1

TextFieldParser類只支持雙引號(")用於封閉。沒有辦法改變這一點。

+0

哦,值得問。在給這張支票之前,會等待一個奇蹟般的答案。 – Paparazzi

2

CodePlex上的這個Fast CSV Reader庫支持自定義的「引用字符」,它可以設置爲®。你可以用這個而不是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 
} 

更新:這裏是你如何使用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