0

テキストファイルを分析する必要があります。このファイルには、いくつかの構成情報が含まれています。データは次のように保持されます (一般的な例):

size=12age=2speed=33id=93539841277312987

ただし、ファイルには次のようなセパレーターが含まれている,場合もあります。

size = 12 , age = 2 , speed = 33 , id = P93AR9841277312987

入力が従う規則は 1 つだけです。構成名の=後に値が続きます。

私が持っているもの:辞書に保存された入力ファイルで発生する可能性のあるすべての構成名

私が欲しいもの:入力ファイルの値を辞書の適切なキーに保存します([サイズ、12] [年齢、2] ...)。1 つと次の構成名の間の値を抽出するのに苦労しています。

これまでに行ったこと: 必要な文字列の開始インデックスとして構成名の終了インデックスを見つけます。しかし、次の構成名がどこから始まるかを判断するのは困難です。さらに、構成名リストの最後も処理する必要があります (参照する次の構成名がないため)。1 つのアイデアは、テキスト ファイル内のすべての構成名を検索し、現在の構成名の終了インデックスの終了インデックスよりも小さいが、まだ大きいものの開始インデックスを選択することです。しかし、もっと簡単な方法があると思います。

4

2 に答える 2

0

以下は、テキスト ファイルの仕様が与えられた場合に実行できる最善の Perl ソリューションです。

my @keys = ('foo','bar','2baz','bla');
my $data = "spoofoo=123  , bar= 12baz = blah";

foreach my $key (@keys)
{
    if ($data =~ /\Q$key\E\s*=\s*([\w\d]+)/) 
    {
        my $val = $1;
        foreach my $key2 (@keys)
        {
           if ($val =~ /(.*)\Q$key2\E$/)
           {
               $val = $1;
               last;
           }
        }
        print "$key value is $val\n";
    }
    else
    {
        print "$key not found\n";
    }
}

これにより、辞書内の各キーに続く値が見つかります。次に、見つかった値をチェックして、その値の末尾が実際に別のキーの先頭であるかどうかを確認します。ただし、一連のキーと潜在的な値によっては、単純に解決できない状況が発生する可能性があります。

于 2012-10-16T09:13:06.167 に答える
0

私はこの正規表現を思いつきましたが、値に区切り記号が含まれています。一致するたびに、キーと値の 2 つのキャプチャ グループが返されます。

(size|age|speed|id)\s*=\s*(.+?)(?=\s|size|age|speed|id|$)

これを変更して、すべての構成名を追加できます。先読みを変更して区切り記号を含めることもできます。その場合、値に区切り記号は含まれません。これがテストです

于 2012-10-16T08:58:55.403 に答える