C ++での文字列の解析
-
03-07-2019 - |
質問
大量のログ行があり、各行を解析する必要があります 非常に重要です)。
各ログ行の形式は
ですcust_name time_start time_end(IPまたはURL)*
つまり、IPアドレス、時間、時間、およびセミコロンで区切られたIPアドレスまたはURLの空のリスト。最後のリストにipまたはurlのみがある場合、セパレータはありません。もしそこにあるなら 1より大きい場合、セミコロンで区切られます。
この行を解析し、データ構造に読み込む方法が必要です。 time_startまたは time_endは、システム時刻またはGMTのいずれかです。 cust_nameには複数の文字列を含めることもできます スペースで区切られます。
これを行うには、文字ごとに読み取り、基本的に独自のパーサーを作成します。 これを行うより良い方法はありますか?
解決
多分Boost RegExp libが役立ちます。 http://www.boost.org/ doc / libs / 1_38_0 / libs / regex / doc / html / index.html
他のヒント
Boost Tokenizer この種のこと。入力ストリームをトークンに分割するのに役立ちます。トークン間にカスタムセパレーターがあります。
正規表現を使用すると( boost :: regex
はC ++の優れた実装です)、文字列のさまざまな部分を簡単に分離できます- cust_name、time_start ...
すべてのurls \ ips
2番目のステップは、必要に応じてそのグループをより詳細に解析することです。たとえば、 boost :: datetime
ライブラリを使用して解析できます(文字列形式が標準でない場合はカスタムパーサーを記述します)。
C ++でこれを行う理由は何ですか? perlのようなものの明らかな仕事のように思えます。
カスタム入力にはカスタムパーサーが必要です。または、理想的な世界があり、エラーが存在しないように祈ってください。特に、効率を上げたい場合。いくつかのコードを投稿すると役立つかもしれません。
分割を使用できるこのような単純な文法については、 http://www.boost.org/doc/libs/1_38_0/doc/html/string_algo/usage.html#id4002194
更新は回答を大幅に変更しました!
大量のログ行があり、各行を解析する必要があります(したがって、効率が非常に重要です)。
C ++は、この状況での効率の点ではあまり役に立ちません。 C ++で高速な解析コードを使用しているからといって、プログラムのパフォーマンスが高くなるという考えにだまされないでください!
ここで本当に必要な効率は、「マシンコード」でのパフォーマンスではありません。解析コードのレベルですが、全体的なアルゴリズムレベルです。
あなたがやろうとしていることを考えてください。
巨大なテキストファイルがあり、各行をデータ構造に変換する場合、
メモリに巨大なデータ構造を保存することは、使用している言語に関係なく、非常に効率が悪い !
あなたがする必要があるのは、「フェッチ」です。一度に1行ずつデータ構造に変換して処理します。データ構造の処理が完了したら、次の行をフェッチしてデータ構造に変換し、処理します。 、繰り返します。
そうすれば、すでに主要なボトルネックを解決できました。
テキストの行を解析するために、データのフォーマットは非常に単純であるようです。少し前に尋ねた同様の質問を確認してください: C ++文字列解析(pythonスタイル)
あなたの場合、文字列ストリームを使用し、>>
演算子を使用して次の" thing"を読み取ることができます。行に。
サンプルコードについては、この回答をご覧ください。
代わりに、(この部分を削除したくなかった!!) これをpythonで書くことができれば、ずっと簡単になります。あなたの状況はわかりませんが(C ++で動けないようです)、それでも
Pythonジェネレータ式を使用してこれらの種類のタスクを効率的に実行するためのこのプレゼンテーションをご覧ください: http:/ /www.dabeaz.com/generators/Generators.pdf
読みながら読む価値はあります。 スライド31で、彼はあなたがやろうとしていることに非常に似ているように見えるものを扱っています。
少なくともインスピレーションが得られます。
また、特定の文字列解析コードではなく、全体的なアルゴリズムによってパフォーマンスが向上することを非常に強く示しています。
この種の入力を解析するには、単純なlex / yacc | flex / bisonボキャブラリーを使用してみてください。
必要なパーサーは本当にシンプルに聞こえます。 これを見てください。コンパイルされた言語はすべて、それを解析できるはずです。非常に高速。次に、どのデータ構造を構築するかが問題になります。保存します。