web-dev-qa-db-ja.com

Nice列レイアウト用にvimで再フォーマットする

このデータセットはcsvファイルにあります

1.33570301776, 3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828, 0.010352, 0.0102677, 0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804, 0.0133687, 0.010329, 0.00163437, 0.00191202, 0.0134425 
1.34538754675, 3.3689e-06, 9.86066e-06, -9.12075e-06, 1.18058e-05, 0.00334344, 0.00342207, 0.00332897, 0.00345504, 0.00165532, 0.00170412, 0.00164234, 0.00441903, 0.00459294, 0.00449357, 0.00339737, 0.00166596, 0.00451926, 0.00455153
1.34808186291, -1.99011e-06, 6.53026e-06, -1.18909e-05, 9.52337e-06, 0.00158065, 0.00166529, 0.0015657, 0.0017022, 0.000740644, 0.00078635, 0.000730052, 0.00219736, 0.00238191, 0.00212762, 0.00163783, 0.000750669, 0.00230171, 0.00217917

ご覧のとおり、数字のフォーマットは異なり、位置がずれています。結果がこれになるように、vimに列を適切にすばやく整列させる方法はありますか

1.33570301776,  3.61194e-06, 7.24503e-06, -9.91572e-06, 1.25098e-05, 0.0102828,  0.010352,   0.0102677,  0.0103789, 0.00161604, 0.00167978, 0.00159998, 0.00182596, 0.0019804,  0.0133687,  0.010329,   0.00163437, 0.00191202, 0.0134425 
1.34538754675,  3.3689e-06,  9.86066e-06, -9.12075e-06, 1.18058e-05, 0.00334344, 0.00342207, 0.00332897, 0.00345504,0.00165532, 0.00170412, 0.00164234, 0.00441903, 0.00459294, 0.00449357, 0.00339737, 0.00166596, 0.00451926, 0.00455153
1.34808186291, -1.99011e-06, 6.53026e-06, -1.18909e-05, 9.52337e-06, 0.00158065, 0.00166529, 0.0015657,  0.0017022, 0.000740644,0.00078635, 0.000730052,0.00219736, 0.00238191, 0.00212762, 0.00163783, 0.000750669,0.00230171, 0.00217917

Ctrl-vでセクションをコピーして貼り付けるのは素晴らしいことです。ヒントはありますか?

117
Stefano Borini

何らかの種類のUNIX(Linuxなど)を使用している場合は、column(1)コマンドを使用してチートおよびフィルタリングできます。

:%!column -t

上記は間違った文字列リテラル内の区切り文字を解析するため、前処理手順とこのファイルの区切り文字の指定が必要になる可能性があります。たとえば:

%!sed 's/","/\&/' | column -t -s '&'
249
sunny256

2列だけを揃えたい場合があります。その場合、プラグインは不要で、次のような純粋なVim機能を使用できます。

  1. セパレータを選択します。 OPの投稿では、これはコンマであり、私の例では=
  2. その前後にスペースを追加します。私が使う s/=/= ...spaces... /これを視覚的に選択します。
  3. 最長のWordを見つけて、カーソルをその後に置きます。
  4. dwと垂直移動を使用して、余分な空白をすべて削除します。

以下に示すこの手法の例:

Example

別のプラグインをインストールするのに十分な頻度で物事を調整する必要がないと思うので、これはそれを達成するための私の好ましい方法でした-特に、それは多くの思考を必要としません。

50
rr-

Sunny256が示唆したように、columnコマンドはUnix/Linuxマシンでこれを行うのに最適な方法ですが、純粋なVimで(Windowsでも使用できるように)実行したい場合は、方法は、 Align プラグインをインストールしてから実行することです:

:%Align ,
:%s/\(\s\+\),\s/,\1/g

最初の行はコンマのエントリを配置し、2番目の行はコンマを移動して、前の値と同じ高さになるようにします。 AlignCtrlを使用して、一度にすべてを実行するカスタムマッピングを定義できる場合がありますが、その使用方法を思い出すことはできません...

編集

エントリ間の2つのスペースを気にせず、1つのコマンドでこれを行いたい場合は、次のこともできます。

:%Align ,\zs
24
DrAl

また、Tabularizeは非常に優れています http://vimcasts.org/episodes/aligning-text-with-tabular-vim/

6
slf

これはvimマクロを使用した素晴らしい答えです: https://stackoverflow.com/a/8363786/59384 -基本的に、マクロの記録を開始し、最初の列をフォーマットし、記録を停止してからマクロを繰り返します残りのすべての行。

その回答からコピー/貼り付け:

qa0f:w100i <Esc>19|dwjq4@a

100iの後の1つのスペースに注意してください。<Esc>は「プレスエスケープ」を意味します。文字通り「<Esc>」を入力しないでください。

翻訳:

qa         -- record macro in hotkey a
0          -- go to beginning of line
f:         -- go to first : symbol
w          -- go to next non-space character after the symbol
100i <Esc> -- insert 100 spaces
19|        -- go to 19th column (value 19 figured out manually)
dw         -- delete spaces until : symbol
j          -- go to next line
q          -- stop recording macro
4@a        -- run the macro 4 times (for the remaining 4 lines)
6
zcrar70

また、junegunnによって作成された素晴らしい EasyAlign プラグインもあります。

READMEのデモGIF:

4
rr-

csv.vim プラグインを使用できます。

:%ArrangeColumn

ただし、これはあなたが求めていることを正確には行いません。セルの内容を正しく調整しますが、小数点または最初の桁で値を揃えます。

プラグインには、CSVファイルを操作するための他の多くの便利なコマンドがあります。

3
Daan

また、非常に長い列がある場合は、デフォルトの折り返しを無効にすると便利です

:set nowrap 
:%!column -t 

(debianでは、複数の隣接する区切り文字を分割する場合は、列-nのオプションがさらにあります)

2
Amos Folarin

かなり古い質問ですが、私は最近、オンザフライまたは事後のいずれかでテーブルのフォーマットを可能にする優れたvimプラグインを利用しました(ユースケースが必要に応じて):

https://github.com/dhruvasagar/vim-table-mode

1
Alice

この目的で tablign を書きました。でインストール

[Sudo -H] pip3 install tablign

次に、vimでテーブルをマークして、

:'<,'>:!tablign

enter image description here

1
Nico Schlömer

私はpythonユーザーがvim以外でも基本的にあらゆる種類のテキストを列に並べることができるスクリプトを作成しました。これがWindowsユーザーとMacユーザーのどちらに機能するかわかりません。

columnice.py Gist

Vimでの使用。

:'<,'>!columnice =

これは、デリミタとして等号を使用します。しかし、デリミタは捨てられません。

0
Bassim Huis

これは純粋なVimスクリプトの答えです。プラグインもマクロもありません。

例として私の問題の解決策から始めるのが最も明確かもしれません。影響を与えたいコード行を選択し、次のコマンドを使用しました(ビジュアルモードからコマンドモードに入ると、自動的に「 '<、'>」が追加され、視覚範囲に作用することを思い出してください)。

:'<,'>g``normal / "value<0d>D70|P`

「<0d>」と実際に入力しなかった場合を除きます。 ctrl-vを押してから入力したいキーを押すと、コマンドラインに印刷できない文字を入力できます。 「<0d>」は、「ctrl-v enter」と入力した後にコマンドラインに表示されるものです。ここでは、「/」検索モードの終了として、「通常」コマンドによって解析されます。次に、カーソルは現在の行の「値」にジャンプします。

次に、残りの行を[D]削除し、70桁目(または必要に応じて)にジャンプし、削除したものを[P] utします。これは、検索までの最も広い線の幅を決定する必要があることを意味します。ステータスラインにその情報を入力していない場合は、通常モードのコマンド「g ctrl-g」を入力すると、カーソルの列が表示されます。また、存在しない列にジャンプするには「virtualedit」設定が必要です!

視覚ブロックを使用し、すべての行に影響を与えたいため、:g(lobal)コマンドの検索語を空のままにしましたが、視覚選択(および「 '<、'>」)を使用して終了することができます代わりに検索用語があります。または、視覚的な選択と検索語を組み合わせて、より細かく/簡単に項目を絞り込みます。

これは最近学んだことです:複雑なコマンドモードコマンドを台無しにした場合、「u」で元に戻します(バッファに影響する場合)。次に「q:」を押して、従来のバッファのように機能する特別なコマンド履歴バッファに入ります。任意の行を編集してEnterキーを押すと、変更されたコマンドが新しいコマンドとして入力されます。初めてすべてを完全に処方することを強調する必要がない場合は不可欠です。

0
atimholt