隨着TextFieldParser可以指定分隔符圈地。
但附上布爾
TextFieldParser.HasFieldsEnclosedInQuotes
如何指定像®爲
如果答案是要讀取每一行然後拆分,那麼不要提供該代碼
我已經有了一個「手動」解析器。
我的問題是如果我可以使用TextFieldParser。
隨着TextFieldParser可以指定分隔符圈地。
但附上布爾
TextFieldParser.HasFieldsEnclosedInQuotes
如何指定像®爲
如果答案是要讀取每一行然後拆分,那麼不要提供該代碼
我已經有了一個「手動」解析器。
我的問題是如果我可以使用TextFieldParser。
CodePlex上的這個Fast CSV Reader庫支持自定義的「引用字符」,它可以設置爲®。你可以用這個而不是TextFieldParser
,它只支持用雙引號括起來的記錄。
由於我的手冊正在運行,只能保持它。沒有性能問題。我希望簡化代碼。 – Paparazzi
在調用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
情況下,每形成多個轉換。 ;-)
啊...花了一分鐘才明白,「但Enclosed是布爾值」是指具有布爾型數據類型的'HasFieldsEnclosedInQuotes'屬性(而不是引號內的文本是字符串表示形式一個布爾值)。 – JDB