2009-05-15 11 views
5

新しいカラムに入れ、ヘッダ情報:のvim&csvファイル:私は以下のようになり、CSVファイルの数が多い持っ


XXXXXXXX
xxxxxは
出荷を、YD564n
XXXXXXXXX
XXXXX

1、RR1760
2、HI3503
3、HI4084
私は彼らが次のように見えるようにする必要があり


4、HI1824:


XXXXXXXX
xxxxxは
出荷、YD564n
XXXXXXXXX
xxxxxは

YD564n、1 、RR1760
YD564n、2は、HI3503
YD564n、3、HI4084
YD564n、4、HI1824


YD564nは、出荷番号、すべてのCSVファイルごとに異なるであろう。しかし、それは常に "出荷"の直後に来ます。

どのようなvimコマンドを使用できますか?一つのファイルで

答えて

3

これは、マクロを使用して複数のファイルに適用できます。

ここに1つの例があります。次のように入力してください:

3gg$"ayiw:6,$s/^/<C-R>a/<CR>:w<CR>:bn<CR> 

これは恐ろしいようです。私が少しだけうまく説明できるかどうか見てみましょう。

3gg$:3行目の最後に移動します。

"ayiw:最後のワードをレジスタaにコピーします。

:6,$s/^/<C-R>a/<CR>:6行目以降のすべての行で、最初に、レジスタaにあるものを置き換えます。

:w<CR>:bn<CR>:保存して次のバッファに移動します。あなたは200個のcsvファイルを言っている場合

今、あなたは、あなたのオープン

vim *.csv 

としてのvimと

200<C-A> 

、その後

:nnoremap <C-A> 3gg$"ayiw:6,$s/^/<C-R>a/<CR>:w<CR>:bn<CR> 

により、キーにこれをマッピングすることができますそこにCtrl-Aとタイプすると、すべて完了しているはずです。

私は間違いなく適切なスクリプト言語でこれをやるのがより快適だと言いました。それはずっと簡単です。

4

は、通常モードで次のように入力:

qqgg/^Shipment,<CR>ww"ay$}j:.,$s/^/<C-R>a,<CR>q 

<CR>はENTERキーであり、<C-R>はCTRL-Rであること。

これは、そのファイルを更新し、qのコマンドを再計算します。

次に、お互いのファイルに@qと入力します(通常モードでも同様です)。

2

を(これはQを登録して再生されます)これは、Perlのワンライナーとして行うことができます:

perl -i.bak -e' $c = do {local $/; <>}; 
       ($n) = ($c =~ /Shipment,(\w+)/); 
       $c =~ s/^(\d+,)/$n,$1/gm; 
       print $c' shipment.csv 

これは、$cshipment.csvの内容を読み取る$nに出荷IDを抽出し、すべてのCSVを付加します出荷番号と一致します。ファイルは、その場で変更され、バックアップはshipment.csv.bakに保存されます。フィルタとして、それを適応させる、Vimの中からこれを行うには

:%!perl -e' $c = do {local $/; <>}; ($n) = ($c =~ /Shipment,(\w+)/); $c =~ s/^(\d+,)/$n,$1/gm; print $c' 
1

まあ、私をbashのはありませんが、...あなたが考えることができます:vimの中でこれを実行しないでください!

これは、スクリプト言語の古典的な使用例です。 基本的なpython、perl、またはrubyのチュートリアルを受け取ります。これのための解決策は です。

この正規表現はあまり難しくないかもしれません。は、vimでです。 しかし、そこにははるかに簡単な選択肢があります。 さらに柔軟性のあるもの。

1

なぜvimですか?

は、このシェルスクリプトを試してみてください。

#!/bin/sh 

input=$1 

shipment=`grep Shipment $input|awk -F, '{print $2}'` 

mv $input $input.orig 

sed -e "s/^\([0-9]\)/$shipment,\1/" $input.orig > $input 

あなたが特定のファイルを反復処理できます。

for input in *.txt 
do 
    script.sh $i 
done 
1

私もこれはvimのに適していないと思う、方法についてバッシュに代わり?

FILENAME='filename.csv' && SHIPMENT=`grep Shipment $FILENAME | sed 's/^Shipment,//'` && cat $FILENAME | sed "s/^[0-9]/$SHIPMENT,&/" > $FILENAME 
関連する問題