3

。ネット

TextFieldParser を使用すると、区切り文字を割り当てることができます。

しかし Enclosed はブール値です

TextFieldParser.HasFieldsEnclosedInQuotes

同封の ® のように指定するにはどうすればよいですか。

答えが各行を読んでから分割することである場合は、そのコードを提供しないでください。
私はすでに「手動」パーサーを持っています。
私の質問は、TextFieldParser を使用できるかどうかです。

4

3 に答える 3

2

このCodePlex のFast CSV Readerライブラリは、カスタマイズされた「引用文字」をサポートしており、® に設定できます。TextFieldParserレコードを囲むための二重引用符のみをサポートするの代わりにこれを使用できます。

于 2013-01-15T17:59:01.690 に答える
1

を呼び出す前に、すべての®文字を文字に置き換えることができます。ディスク上のファイルを前処理するか、何らかのラッピングを使用します。これが私が書いた例です:"TextFieldParserTextReader

/// <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 に答える
1

このTextFieldParserクラスは"、囲むために二重引用符 ( ) のみをサポートします。これを変更する方法はありません。

于 2013-01-15T17:52:17.307 に答える