2

区切られた文字列の解析を検討しています。次のようなものです

a、b、c

ただし、これは非常に単純な例であり、区切りデータの解析は複雑になる可能性があります。例えば

1,"単純なアルゴリズムですが、失敗します",True

あなたのナイーブな文字列を吹き飛ばします。実装をビットに分割します。区切られたテキストを解析するための比較的防弾のソリューションを提供する、自由に使用/盗む/コピーして貼り付けることができるものはありますか? .NET、プロックス。

更新: TextFieldParserを使用 することにしました。これは、Microsoft.VisualBasic.DLL に隠されている VB.NET の便利な山の一部です。

4

9 に答える 9

4

これを使用してファイルから読み取ります

string filename = @textBox1.Text;
string[] fields;
string[] delimiter = new string[] {"|"};
using (Microsoft.VisualBasic.FileIO.TextFieldParser parser =
       new Microsoft.VisualBasic.FileIO.TextFieldParser(filename)) {
    parser.Delimiters = delimiter;
    parser.HasFieldsEnclosedInQuotes = false;

    while (!parser.EndOfData) {
        fields = parser.ReadFields();
        //Do what you need
    }
}

ここの誰かがこれを変換して、メモリ内の文字列を解析できると確信しています。

于 2008-08-13T19:18:26.730 に答える
2

非常に包括的なライブラリはここにあります:FileHelpers

于 2008-11-05T17:04:01.933 に答える
2

フレームワークについては知りませんが、単純なステート マシンが機能します。

  • 状態 1: " または , にヒットするまで、すべての文字を読み取ります。
    • "の場合: 状態 2 に移動
    • の場合:状態3へ移行
    • ファイルの終わりの場合: 状態 4 に移動
  • 状態 2: " にヒットするまですべての文字を読み取る
    • "の場合:ステート1へ移動
    • ファイルの終わりの場合: ステート 4 に移動するか、文字列が終了していないためにエラーを通知します。
  • 状態 3: 現在のバッファーを出力配列に追加し、カーソルを の後ろに移動して、状態 1 に戻します。
  • 状態 4: これは最終状態で、出力配列を返す以外は何もしません。
于 2008-08-13T18:53:44.660 に答える
2

そのような

var elements = new List<string>();
var current = new StringBuilder();
var p = 0;

while (p < internalLine.Length) {
    if (internalLine[p] == '"') {
        p++;

        while (internalLine[p] != '"') {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past last ',
        p += 2;
    }
    else {
        while ((p < internalLine.Length) && (internalLine[p] != ',')) {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past ,
        p++;
    }

    elements.Add(current.ToString());
    current.Length = 0;
}
于 2008-08-13T18:57:15.463 に答える
1

遅いよりはましです (SO の完全性を高める):

http://www.codeproject.com/KB/database/CsvReader.aspx

この1つのff-ingルール。

GJ

于 2011-06-30T11:02:55.473 に答える
1

ここにいくつかの良い答えがあります:引用されたセクションを無視して文字列を分割する

質問をより正確に言い換えることができます (例: .NET で CSV データを解析するために使用できるコード スニペットまたはライブラリは何ですか?)。

于 2008-08-13T18:55:40.427 に答える
1

恥知らずなプラグインを行うために、区切り文字、位置、または正規表現に基づいて大量のテキストをすばやく解析するために使用するfotelo (Formatted Text Loader)と呼ばれるライブラリにしばらく取り組んできました。簡単な文字列の場合はやり過ぎですが、ログや大量の作業をしている場合は、まさに必要なものかもしれません. これは、SQL*Loader に似た制御ファイル モデルで動作します (その背後にあるインスピレーションのようなものです)。

于 2008-08-13T19:54:40.807 に答える
0

一般的なフレームワークでは、次の 2 つのことを指定する必要があると考えています。1. 区切り文字は何ですか。2. これらの文字がカウントされないのはどのような場合ですか (引用符で囲まれている場合など)。

このようなことをする必要があるたびに、カスタム ロジックを記述したほうがよいと思います。

于 2008-08-13T18:49:40.020 に答える
0

最も簡単な方法は、文字列を char 配列に分割し、文字列決定子と分割文字を探すことです。

単体テストは比較的簡単なはずです。

基本的な .Spilt メソッドと同様の拡張メソッドでラップできます。

于 2008-08-13T18:57:16.790 に答える