私の前の多くの不幸なプログラマーの魂のように、私は現在、死ぬことを拒否する古風なファイル形式を扱っています。私が話しているのは、1970 年代の古いフォーマット仕様です。それが私だけの責任であれば、ファイル形式と、それを処理する方法を知っていたツールの両方を捨てて、最初からやり直すでしょう. 私は夢を見ることができますが、残念ながらそれは私の問題を解決しません.
形式:何年にもわたる無意味な改訂により、かつての下位互換性がほとんどすべて破壊されたため、定義がかなり緩くなっています。基本的に、唯一変わらないのは、セクションの見出しがあり、これらの行の前後に何が来るかについてのルールがほとんどないということです。見出しは連続していますが (例: HEADING1、HEADING2、HEADING3、...)、番号は付けられておらず、必須ではありません (例: HEADING1、HEADING3、HEADING7)。ありがたいことに、考えられるすべての見出し順列がわかっています。偽の例を次に示します。
# Bunch of comments
SHOES # First heading
# bunch text and numbers here
HATS # Second heading
# bunch of text here
SUNGLASSES # Third heading
...
私の問題:これらのセクションの見出しでこれらのファイルを複数連結する必要があります。これを非常にうまく行うperlスクリプトがあります。
while(my $l=<>) {
if($l=~/^SHOES/i) { $r=\$shoes; name($r);}
elsif($l=~/^HATS/i) { $r=\$hats; name($r);}
elsif($l=~/^SUNGLASSES/i) { $r=\$sung; name($r);}
elsif($l=~/^DRESS/i || $l=~/^SKIRT/i ) { $r=\$dress; name($r);}
...
...
elsif($l=~/^END/i) { $r=\$end; name($r);}
else {
$$r .= $l;
}
print STDERR "Finished processing $ARGV\n" if eof;
}
ご覧のとおり、perl スクリプトを使用して、特定のパターン マッチに到達したときに参照先を変更し、次のパターン マッチに到達するまで、ファイルの各行をそれぞれの文字列に連結します。これらは、後で 1 つの大きな連結ファイルとして出力されます。
私は perl を使い続けるつもりでしたし、そうすることができましたが、私のニーズは日々複雑になってきており、この問題を python でエレガントに解決する方法を本当に知りたいと思っています (できますか?)。現在のところ、Python での私の方法は、基本的にファイル全体を文字列としてロードし、見出しの場所を検索してから、見出しインデックスに基づいて文字列を分割し、文字列を連結することです。これには、他の言語では非常に単純に見えるものに対して、多くの正規表現、if ステートメント、および変数が必要です。
これは本当に基本的な言語の問題に要約されるようです。参照渡しである他の言語のスタイルと比較して、Python の「オブジェクト呼び出し」スタイルに関する非常に素晴らしい SO の議論を見つけました。 変数を参照渡しするにはどうすればよいですか? それでも、Python でこれを行うエレガントな方法はまだ思いつきません。誰かが私の脳を正しい方向に向けるのを助けることができれば、それは大歓迎です.