。网
用 TextFieldParser 可以分配分隔符。
但封闭是布尔值
TextFieldParser.HasFieldsEnclosedInQuotes
我如何为随附的内容指定 like ®。
如果答案是读取每一行然后拆分,则不要提供该代码。
我已经有一个“手动”解析器。
我的问题是我是否可以使用 TextFieldParser。
。网
用 TextFieldParser 可以分配分隔符。
但封闭是布尔值
TextFieldParser.HasFieldsEnclosedInQuotes
我如何为随附的内容指定 like ®。
如果答案是读取每一行然后拆分,则不要提供该代码。
我已经有一个“手动”解析器。
我的问题是我是否可以使用 TextFieldParser。
CodePlex 上的这个Fast CSV Reader库支持自定义的“引用字符”,可以设置为 ®。您可以使用它来代替TextFieldParser
,它只支持双引号来包含记录。
该类TextFieldParser
仅支持用双引号 ( "
) 括起来。没有办法改变这一点。
您可以®
在"
调用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
实例链接在一起以执行多个转换。;-)