質問
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を使用してセクションをコピーして貼り付けると便利です。ヒントはありますか?
解決
何らかのUNIX(Linuxなど)を使用している場合は、column(1)コマンドを使用してチートおよびフィルタリングできます。
:%!column -t
上記は間違った文字列リテラル内の区切り文字を解析するため、前処理手順とこのファイルの区切り文字の指定が必要になる可能性があります。
%!sed 's/","/\&/' | column -t -s '&'
他のヒント
2つの列だけを揃えたい場合があります。その場合、プラグインは不要で、次のような純粋なVim機能を使用できます。
- セパレータを選択します。 OPの投稿では、これはコンマです。私の例では、これは
=
です。 - その前後にスペースを追加します。このために視覚的な選択で
s/=/= ...spaces... /
を使用します。 - 最長の単語にロケートし、カーソルの後にカーソルを置きます。
-
dw
および垂直方向の移動を使用して、余分な空白をすべて削除します。
以下に示すこの手法の例:
他のプラグインをインストールするのに十分な頻度で物事を調整する必要がないと思うので、これはそれを達成するための私の好ましい方法でした-特にそれは多くの思考を必要としません。
sunny256が示唆したように、column
コマンドはUnix / Linuxマシンでこれを行う素晴らしい方法ですが、(Windowsでも使用できるように)純粋なVimで実行したい場合は、方法は、 Align プラグインをインストールしてから実行します:
:%Align ,
:%s/\(\s\+\),\s/,\1/g
最初の行はコンマのエントリを配置し、2行目はコンマを移動して、前の値と同じ高さになるようにします。 AlignCtrl
を使用して、一度にすべてを実行するカスタムマッピングを定義できる場合がありますが、その使用方法を思い出すことはできません...
編集
エントリ間の2つのスペースを気にせず、1つのコマンドでこれを行いたい場合は、次のこともできます。
:%Align ,\zs
また、Tabularizeは非常に優れています http://vimcasts.org/episodes / aligning-text-with-tabular-vim /
これはvimマクロを使用したすばらしい回答です: https://stackoverflow.com/a/8363786/59384 -基本的に、マクロの記録を開始し、最初の列をフォーマットし、記録を停止してから、残りのすべての行に対してマクロを繰り返します。
その回答からコピー/貼り付け:
qa0f:w100i <Esc>19|dwjq4@a
100iの後の1つのスペース、および<!> lt; Esc <!> gt;に注意してください。 <!> quot; press escape <!> quot;-<!> quot; <!> lt; Esc <!> gt; <!> quot;と入力しないでください。文字通り。
翻訳:
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)
csv.vim プラグインを使用できます。
>:%ArrangeColumn
ただし、これはあなたが要求したことを正確に行いません:セルの内容を正しく調整しますが、値は小数点または最初の桁に揃えられます。
プラグインには、CSVファイルを操作するための他の多くの便利なコマンドがあります。
また、非常に長い列がある場合は、デフォルトの折り返しを無効にすると便利です
:set nowrap :%!column -t
(debianでは、複数の隣接する区切り文字を分割する場合、列-nのオプションがさらにあります)
かなり古い質問ですが、私は最近、オンザフライまたは事後のテーブルフォーマッティングを可能にする優れたvimプラグインを利用しました(ユースケースが必要とする場合):
この目的のために tablign を作成しました。でインストール
[sudo -H] pip3 install tablign
次に、vimでテーブルをマークし、実行します
:'<,'>:!tablign
私は、ユーザーがvim以外でも基本的にあらゆる種類のテキストを列記できるようにするpythonスクリプトを書きました。これがWindowsユーザーとMacユーザーのどちらで機能するかはわかりません。
vimでの使用法
:'<,'>!columnice =
これは、デリミタとして等号を使用します。ただし、デリミタは破棄されません。
ここ<!>#8217;は純粋なVimスクリプトの回答で、プラグインもマクロもありません:
例として、私の問題<!>#8217;の解決策から始めるのが最も明確かもしれません。影響を与えたいコード行を選択し、次のコマンドを使用しました(ビジュアルモードからコマンドモードに入ると、<!>#8220; '<!> lt;、' <!> gt; <!> #8221;したがって、視覚範囲に作用します):
:'<,'>g``normal / "value<0d>D70|P`
実際に<!>#8220; <!> lt; 0d <!> gt; <!>#8221;と入力しなかった場合を除きます。 ctrl-vを押してから入力するキーを押すと、コマンドラインに印刷できない文字を入力できます。 <!>#8220; <!> lt; 0d <!> gt; <!>#8221; <!>#8216; ctrl-v enter <!>#8217;と入力した後、コマンドラインに表示されるものです。ここでは、<!>#8220; <!>#8220; normal <!>#8221;によって解析されます。 <!>#8220; / <!>#8221の出口としてのコマンド;検索モード。次に、カーソルは<!>#8220にジャンプします。 value <!>#8221;現在の行に。
その後、行の残りを単に[D]削除し、70桁目(または、必要に応じて)にジャンプし、削除したものを[P] utします。これは、検索までの最も広い線の幅を決定する必要があることを意味します。ステータスラインにその情報を入力していない場合は、通常モードのコマンド<!>#8216; g ctrl-g <!>#8217;を入力して、カーソルの列を表示できます。また、<!>#8217; tが存在しない列にジャンプするには、「virtualedit」設定が必要です!
視覚ブロックを使用してすべての行に影響を与えたいため、:g(lobal)コマンドの検索語を空のままにしましたが、視覚選択(および<!>#8220; 'を使用して終了することもできます) <!> lt;、 '<!> gt; <!>#8221;)そして、代わりに検索用語を入力します。または、視覚的な選択と検索語を組み合わせて、より細かく/簡単に項目を絞り込みます。
Here <!>#8217; s最近学んだこと:複雑なコマンドモードコマンドを台無しにした場合は、<!>#8216; u <!>#8217;で取り消します。 (バッファに影響する場合)、<!>#8220; q:<!>#8221;を押します。従来のバッファのように機能する特別なコマンド履歴バッファを入力します。任意の行を編集してEnterキーを押すと、変更されたコマンドが新しいコマンドとして入力されます。 <!>#8217;最初にすべてを完全に定式化することを強調したくない場合は不可欠です。