12

Microsoft.VisualBasic.FileIO の TextFieldParser を使用すると、以下のように CSV ファイルを解析できます。

using (TextFieldParser parser = new TextFieldParser(CSVPath))
{
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");
    parser.HasFieldsEnclosedInQuotes = true;
    while (!parser.EndOfData) { string[] fields = parser.ReadFields(); }
}

ただし、これは TextFieldParser を CSV ファイル パスで初期化することに依存しています。同じ効果を得ることができますが、データ レコード自体を含む文字列を渡しますか?

たとえばData1,6.5,"Data3 ""MoreData"""、文字列変数に保存された (引用符がエスケープされているため、引用符で囲まれた最後のデータに注意してください) の値を持つ CSV データ レコードを使用して、データを次のような文字列配列に変換できますか。

[0] = "Data1"
[1] = "6.5"
[2] = "Data3 \"MoreData\""
4

3 に答える 3

8

Stream または TextReader から TextFieldParser をインスタンス化することもできます。文字列パスである必要はありません。したがって、ストリームに入れることができる限り、本当に好きなものをストリーミングできます。単純に MemoryStream である可能性があります。

https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser%28v=vs.110%29.aspx

例えば

using (var stream = new MemoryStream())
{
    var input = "A, B, C, D\r\n";
    input += "Jeremy,Paul,Linda,Joe\r\n";
    var bytes = System.Text.Encoding.Default.GetBytes(input);
    stream.Write(bytes, 0, bytes.Length);
    stream.Seek(0, SeekOrigin.Begin);
    using (var parser = new TextFieldParser(stream))
    {
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");
        parser.HasFieldsEnclosedInQuotes = true;
        while (!parser.EndOfData)
        {
            Console.WriteLine("Line:");
            var fields = parser.ReadFields();
            foreach (var field in fields)
            {
                Console.WriteLine("\tField: " + field);
            }
        }
    }
}
于 2016-03-24T20:38:15.623 に答える
-1

TextFieldParser を使用するのが最も簡単で簡単な方法であり、受け入れられた回答で述べたように、ストリームから完全にインスタンス化できます。

それにもかかわらず、G ** gle検索の後にここにたどり着いたすべての人に貴重な情報を提供して、受け入れられた回答を完成させたいと思います。

このコードで CSV データを読み取る非常に単純なパーサーを見つけました。

var res = new List<string[]>();

using (TextFieldParser parser = new TextFieldParser(filepath))
{
    parser.CommentTokens = new string[] { "#" };
    parser.SetDelimiters(new string[] { ";" });
    parser.HasFieldsEnclosedInQuotes = true;

    // Skip over header line.
    parser.ReadLine();

    while (!parser.EndOfData)
    {
        res.Add(parser.ReadFields());
    }
}

ヘッダーのフィールドの少なくとも 1 つに CRLF が含まれていると、望ましくない結果が生じる可能性があるため、parser.ReadLine() には十分注意してください。このような場合、最初に読み取った行には、最初の CRLF の直後にヘッダーの残りの部分が含まれます。

そのため、適切にフォーマットされたフィールド ( https://www.rfc-editor.org/rfc/rfc4180の CSV RFC を参照) を細心の注意を払って処理する ReadFields を使用して、ヘッダーを含むファイル全体を読み取る方がはるかに優れていることに注意してください。 、必要に応じて最初の行を無視します。

4180 RFC は完全であり、適切な CSV ライターも実装したい場合に道を譲ります。

CSV の仲間と一緒に楽しみましょう。

于 2020-03-27T18:36:56.557 に答える