3

GraphViz ドット言語で記述された HDF5 ファイル形式用に作成したドキュメントがいくつかあります。(これは、中括弧がたくさんある C に似た言語です。) このマスター ファイルには、次のような多数の要素が含まれています。

subgraph cluster_clustername { 
                              ...
                              lots of stuff including more curly braces spanning multiple lines
                              ...
                              }

clustername に基づいてこのテキスト ブロックを抽出したいと考えています。(すべてを含む超大規模なグラフではなく、これらのサブグラフのグラフを個別に作成したいと考えています。各サブグラフ クラスタは、HDF5 外部ソフトリンクを介して接続された個別の HDF5 ファイルです。)

この目的のテキストの塊を抽出する方法があるはずです (特定のテキスト パターンの後の最初の { と終了 } を複数の行にまたがって一致させる演習)。これは、普及しているため、比較的一般的なタスクのようです。 C および C に似た言語。

私の考えでは、これを達成するための最有力候補のツールは次のとおりです。

おかしい

パイソン

gvpr - graphviz で提供されるグラフ ストリーム エディター (ただし、これは他の人にとっては役に立ちません。同じ質問をしている C プログラマーや、Web 上にいくつかの例が存在し、構文がわかりにくいと言う)

シード

現在、マスター ファイルを維持し、Mx ediff-regions-linewise を使用して Emacs の各派生ファイルを更新しますが、自動化された (Make を使用してドキュメント ファイルを作成できるようにするため) 派生ファイルを生成する堅牢な方法が必要です。私がささやかな経験を持っている上記の唯一のツールはsedですが、パターンが複雑で複数行にまたがっているため、awk や python のようなツールがこのタスクにより適していると思います。

実際、私は awk で参照カウントに似た手法を試しましたが、awk のより微妙な動作のいくつかを理解するのに問題があり、過去に awk 1 ライナーしか実際に使用していませんでした。

ご協力いただきありがとうございます。-Z

4

3 に答える 3

1

Perl を使用する場合は、Text::Balancedモジュールを使用します。バランスの取れた区切り記号の前、中、後にテキストを返すことができます。

于 2011-03-30T21:07:44.643 に答える
1

これが最善または最も洗練されたソリューションであるとは言えませんが、以前にこの python 関数を使用したことがあり、機能します。コメントまたは文字列リテラル内の不均衡な括弧は処理されませんが、ネストされた括弧は処理されます。のように使うtoken = get_token_between_chars(string_to_parse, '{', '}')

def get_token_between_chars(string, start_char, end_char):
  token = ''

  n_left = 0
  n_right = 0
  closed = False

  start_index = 0
  end_index = 0
  count = 0

  for c in string:
    if c == start_char:
      n_left += 1
      if n_left == 1:
        start_index = count
    elif c == end_char:
      n_right += 1

    if n_left > n_right and not closed:
      token += c
    elif n_left > 0 and n_left == n_right:
      closed = True
      end_index = count
      break

    count += 1

  token = token[1 : len(token)]
  return [start_index, token, end_index+1]
于 2011-03-31T11:50:41.677 に答える
0

awk または優れた文字列処理機能を備えた任意のプログラミング言語を使用できます。たとえば、いくつかの顕著なパターンを使用してテキストを分割します。たとえば、「サブグラフ」が各ブロックを分離し、cluster_A を取得したいとします。これを行うことができます

$ cat file
subgraph cluster_A {
                              ...
                              lots of stuff more curly {
                          }
                              ...
                              }

subgraph cluster_B {
                              ...
                              lots of stuff including more curly braces spanning multiple lines
                              ...
                              }

$ awk 'BEGIN{RS="subgraph"} /cluster_A/{ print "subgraph "$0} ' file
subgraph  cluster_A {
                              ...
                              lots of stuff more curly {
                          }
                              ...
                              }
于 2011-03-31T00:06:32.890 に答える