。ネット
TextFieldParser を使用すると、区切り文字を割り当てることができます。
しかし Enclosed はブール値です
TextFieldParser.HasFieldsEnclosedInQuotes
同封の ® のように指定するにはどうすればよいですか。
答えが各行を読んでから分割することである場合は、そのコードを提供しないでください。
私はすでに「手動」パーサーを持っています。
私の質問は、TextFieldParser を使用できるかどうかです。
。ネット
TextFieldParser を使用すると、区切り文字を割り当てることができます。
しかし Enclosed はブール値です
TextFieldParser.HasFieldsEnclosedInQuotes
同封の ® のように指定するにはどうすればよいですか。
答えが各行を読んでから分割することである場合は、そのコードを提供しないでください。
私はすでに「手動」パーサーを持っています。
私の質問は、TextFieldParser を使用できるかどうかです。
このCodePlex のFast CSV Readerライブラリは、カスタマイズされた「引用文字」をサポートしており、® に設定できます。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
インスタンスをチェーンして複数の変換を実行できます。;-)
このTextFieldParser
クラスは"
、囲むために二重引用符 ( ) のみをサポートします。これを変更する方法はありません。