2

次のような CSV ファイルがあります。

productSku-1,attribute1,2,3
productSku-1,attribute4,5
productSku-1,attribute4,5
productSku-2,attribute1,2,3
productSku-2,attribute4,5
productSku-3,attribute1,1

の余分なインスタンスを取り除きながら、同じ製品属性を 1 行に「折りたたむ」ことを試みていますproductSku。そのため、product を次の行に一致させてから、次の行と改行を削除productSkuして 1 行に圧縮します。上記の例では、結果は次のようになります。

productSku1,attribute1,2,3,attribute4,5,attribute4,5
productSku2,attribute1,2,3,attribute4,5
productSku3,attribute1,1

次の置換コマンドが機能すると思いましたが、\% 記号を使用したことはありません。

:%s/(^[A-Za-z0-9-]+)(.)((\%(\n\1)(.))+)/\1\2\3

試合から試合を除外すると思ったの \3ですが…うまくいきません。

4

2 に答える 2

1

次の効率的なコマンドを使用します。

:g/\%(^\1,.*\n\)\@<=\([^,]*\)/s/$/,/|-j!
于 2012-08-12T12:04:57.443 に答える
1

この問題を解決する 1 つの方法は次のとおりです。

:sort
qqjkdt,:g/<C-r>"/norm dt,-gJ<Enter>0P+q
10000@q

一歩一歩

:sort- すべての行を productSku で並べ替えます

qq- 記録を開始します。参照してください:help qq

jk- これはちょっとしたマクロ ハックです... 最後の行に到達すると、エラーがスローされ、残りのコマンドは実行されません。

dt,- productSku を削除します

:g/-:globalコマンドを開始します。:help :global

<C-r>"-"レジスターの内容を挿入します (削除した productSku)

norm- の略:help :normal

dt,- productSku は不要なので削除します

-- 前の行に移動

gJ- スペースを入れずに行を結合する

<Enter>-:globalコマンドを終了する

0P- productSku を行頭に戻します

+- 1行下に移動

q- 録音を終了する

10000@q録音を 10k 回 (または必要に応じてそれ以上) 繰り返します。

于 2012-08-11T05:07:40.943 に答える