1

オブジェクト (製品の SKU、名前などを持つ製品) を含む大きな XML ドキュメント (13MB) があります。

XML ドキュメントから削除する必要がある各製品の製品 SKU の大きなリスト (CSV、700 項目) もあります。

XML ドキュメント内の製品にリストの SKU が含まれている場合、その製品/オブジェクト全体を XML ドキュメントから削除したいと考えています。

XML 構造の例を次に示します。

<product>
  <Product_ID><![CDATA[1]]></Product_ID>
  <Product_Name><![CDATA[First product]]></Product_Name>
  <Product_CodeSKU><![CDATA[0000001]]></Product_CodeSKU>
</product>
<product>
  <Product_ID><![CDATA[2]]></Product_ID>
  <Product_Name><![CDATA[Second product]]></Product_Name>
  <Product_CodeSKU><![CDATA[0000002]]></Product_CodeSKU>
</product>
<product>
  <Product_ID><![CDATA[3]]></Product_ID>
  <Product_Name><![CDATA[Third product]]></Product_Name>
  <Product_CodeSKU><![CDATA[0000003]]></Product_CodeSKU>
</product>   

私のリスト (CSV) には、「0000001」のような値が含まれています。その価値を含む製品を見つけて削除したいのですが、他の製品はそのままにしておきます.

4

3 に答える 3

2

Vim スクリプトで、UNIX ベースのシステムを想定すると、次のようになります。

fun! ClearSKUs()
  let command = "cat " . input("Enter path to CSV file: ")
  let data = system(command) | redraw!
  let values = split(substitute(data, "\n", "", ""), ",")
  for value in values
    if search(value) > 0
      silent ?<product?,/<\/product/d
    endif
  endfor
endfun

command! ClearSKUs call ClearSKUs()

実行するには、XML ドキュメントの編集時に次を使用します。

:ClearSKUs

編集:match() @Benが言及したように置き換えsearch()、単一の通常のコマンドを使用するように更新しました。

EDIT 2:通常のコマンドをd(@Benに感謝します!)に与えられた範囲に置き換え、入力を受け取った後にプロンプ​​トをクリアするように更新しました。

于 2013-10-09T04:07:25.943 に答える
2

まず、これを複数回行う場合は、完全に自動化された方法でそれを行う素敵な Perl スクリプトを作成します。そうすれば、私たち Vim オタクだけでなく、他の人もそれを使用できます。私が Perl と言ったのは、それが私が知っていることだからです。他の人は、python や Ruby など、選択した言語が何であれ言うでしょうが、繰り返し使用する場合、Vim はこれには不適切なツールです。

ただし、何かをすばやく完了したいだけで、あまり一般的なタスクではない場合もあります。

Vim でこれに取り組むには、XML ファイルと一緒に分割バッファーで CSV を開きます。

  1. CSV ファイルの最初の行にカーソルを置きます。
  2. 選択したレジスタへのマクロの記録を開始します。例えば、qa
  3. どの行にいても削除する SKU にカーソルを常に配置する汎用コマンドを実行します。
  4. yiw(または、SKU 全体をヤンクする他のコマンド)。
  5. <C-W>wウィンドウを XML ファイルに切り替えます。
  6. :g#<C-R>0:g コマンドを開始し、SKU をパターンとして挿入します。誤検知がある場合は、実際の SKU 行のみに一致するようにこれを微調整する必要がある場合があります。
  7. コマンドを通常のコマンドで終了して:g、タグ全体を削除します。たとえば、:g#0000001#norm! vatatVd
  8. でCSVファイルに戻ります<C-w>p
  9. で CSV ファイルの次の行に移動します。j
  10. でマクロの記録を停止しqます。
  11. マクロを 1 回繰り返してテストします (例: @a)。
  12. テストが失敗した場合は、繰り返し可能なマクロが得られるまで、手順 1 ~ 10 を繰り返します。
  13. (10) が意図したとおりに機能する場合は、必要に応じて何度でも繰り返します。9999999@a
于 2013-10-09T03:40:56.800 に答える