3

解析する必要がある 2000 行を超えるファイルがあります。100% 正確な結果が得られるようにしたいと考えています。結果は MariaDB にインポートされます。

ファイルは次のようになります。

line 0: #start#
line 1: 20111211\200000
line 2: n=john|l=smith,131_stree_apt#102_city_state_11111_country,19989989988|17771112222,user%64domain.com,12,21,551|626|23\r
...
line 2156: #end#

行 1 は 24 時間形式の日時です。行 2 は行形式です。

  • n = 名前
  • l = 姓
  • 完全な住所
  • 電話+携帯電話
  • Eメール
  • 合計ゴール
  • 合計パス
  • 氷上での時間 + ベンチでの時間
  • ペナルティ分

正規表現がわかりません。私の他のアイデアは、各行を解析してから各コンマ、次に各パイプなどを解析することでしたが、このアプローチは遅く、正規表現よりも正確ではないと思います。私は正しいですか?

4

3 に答える 3

7

私は正規表現を理解できないので、私の考えは、各行を解析してから各コンマを解析し、次に各パイプを解析することでした....これは遅く、正規表現よりも正確ではないと思います

行ってみませんか?これに惑わされないで、大胆に。一般的に、私があなただったら、次のようにします。

  1. 簡単な実装を行う
  2. 試して
  3. チューニングする

〜 2000 レコードはそれほど多くないため、3 番目のステップは必要ないかもしれません (特に、これが 1 回しか実行されない移行である場合は、2 分かかる場合はどうなるでしょうか?)。

ところで: これは一般的なプログラミングのアドバイスであり、多くの問題に当てはまります。時期尚早に最適化しないでください

于 2011-12-09T00:52:38.020 に答える
1

明らかに、完全な codez は提供しません。ただし、プレースホルダーの回答として、基本的なアプローチを紹介します。

preg_match('/
   ^
     n=(\w+)       # just alphanumerics
     \|
     l=(\w+)
     ,
     ([\w\h\#]+)    # mixture of letters and space and #
     ,
     ([^,]*)       # anything but commas
     ...
   $
  /x', $line, $match);

疑似 CSV 行のフィールドと同じ数の文字クラスとキャプチャ グループが必要です。\d+小数のみのマッチングにも役立つ場合があります。

基本的な文字列関数を使用して偽のパーサーを作成することは、ここでは明らかに賢明ではありません。正規表現が正確にそれをより確実に、より少ないコードで実行できる場合です。

于 2011-12-09T00:56:58.330 に答える