3

テキスト情報を含む200MBの巨大なXMLドキュメントがあります。データは以前、2列のページメーカーファイルに保存されていました。タグ付けした後、特定のテキストにハイフンが含まれていることがわかりました。これは、フォーマットに適合しなかった単語がハイフンで区切られた2つの単語に分割されたためです。また、このXMLドキュメントは別の理由でハイフンを使用しています。短い文を区切る(メモ用)。

単語の間にあるハイフンを見つけたいです。削除を見つけたいハイフンが標準パターンであることに気づきました。例えば。

ハイフンの最初の使用-(私が見つけて置き換えたいもの)

questionだろques-tion answerans-wer

ハイフンの他の使用法は-(見つかりません)

Pattern matchin - Regex Expressions - ...

したがって、両方の標準形式は-

space-space

letter-letter

XQueryを使用してこれらすべてを見つけるにはどうすればよいですか?つまり、2番目のものを見つける方法...または他の方法でそれらを見つける方法...巨大なXMLファイルでこれらを見つけて置き換えるように...私の神..

4

1 に答える 1

2

200 MB は巨大ではありません。:)

タグ/属性名にハイフンが含まれていないことが確実な場合は、sed を使用してください (推奨されません!):

sed -E 's/([[:alpha:]]+)\-([[:alpha:]]+)/\1\2/g' doc.xml out.xml

これには XQuery を使用することをお勧めします。そうすれば、複雑な XML 構文の解析に対処する必要がなくなります。

declare function local:copy-replace($element as element()) {  
  element {node-name($element)}  
          {$element/@*, 
        for $child in $element/node()  
        return
            if ($child instance of element())
            then local:copy-replace($child)  
            else replace($child, "(\w+)\-(\w+)","$1$2")
          }  
};

local:copy-replace(/*)

属性はまだ扱っていません。属性にハイフン付きのテキストが含まれている場合は、それらを個別に抽出して含める必要があります。

パターンとして喜んで覚えていたこの回答で、一部のクレジットは不明なユーザーに送られます。

于 2012-06-11T08:58:40.483 に答える