3

。网

用 TextFieldParser 可以分配分隔符。

但封闭是布尔值

TextFieldParser.HasFieldsEnclosedInQuotes

我如何为随附的内容指定 like ®。

如果答案是读取每一行然后拆分,则不要提供该代码。
我已经有一个“手动”解析器。
我的问题是我是否可以使用 TextFieldParser。

4

3 回答 3

2

CodePlex 上的这个Fast CSV Reader库支持自定义的“引用字符”,可以设置为 ®。您可以使用它来代替TextFieldParser,它只支持双引号来包含记录。

于 2013-01-15T17:59:01.690 回答
1

该类TextFieldParser仅支持用双引号 ( ") 括起来。没有办法改变这一点。

于 2013-01-15T17:52:17.307 回答
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实例链接在一起以执行多个转换。;-)

于 2013-01-15T18:01:09.687 回答