素敵な列レイアウトのためにvimで再フォーマットする


126

このデータセットは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を使用してセクションをコピーして貼り付けるのに最適です。ヒントはありますか?

回答:


263

ある種のUNIX(Linuxなど)を使用している場合は、column(1)コマンドを使用してそれをだまし、フィルタリングできます。

:%!column -t

上記は文字列リテラル内の区切り文字を解析しますが、これは誤りであるため、前処理の手順とこのファイルの区切り文字の指定が必要になる可能性があります。次に例を示します。

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

1
クールなコマンド、私はそれを認識していませんでした(過去にそのような操作を行うためにカスタムのperlスクリプトを記述していました)。
hlovdal 2009

24
ファイルに使用するスペースがなかったため:%!column -t -s ','。カンマが削除されるため、技術的にはcsvファイルではなくなります。しかし、それらを美しく配置します。それが私が必要としたことです。
エドゥアルド

27
すばらしいヒントです。追加するだけで、ビジュアル選択にも使用できます:'<,'>!column -t
freitass

2
列にコンマを含む引用符付きの列を処理するソリューションを知っている人はいますか?例 "2151 Main ST Houston、TX"
metrix '12 / 12/30

3
@metrix、これは非常に不器用な回避策です:1)区切り文字内のスペースを別の文字に変換します。2)次にcolumn投稿の説明に従って実行します。3)次に区切り文字をスペースに置き換えます。ステップ#1のためのビジュアルモードの例コマンドがある:'<,'>s/"\(\w\+\) \(\w\+\)"/"\1_\2"/g
ルチアーノ

54

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

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

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

例

私は別のプラグインをインストールするのに十分な頻度で調整する必要がないことに気付いたので、これはそれを達成するための私の好ましい方法でした。


4
どのようにしてその素敵なgifを作りましたか?
Stefano Borini、2015

1
blog.bahraniapps.com/gifcamは残念ながらWindows専用のツールのようです。
rr- 2015

上部の位置合わせが完了したら、カーソルを画面の中央に移動して、下部の位置合わせをどのように開始しましたか?
サイチョイ2015

5
後は:s/=/ =/それがはるかに優れて使用することですCtrl + V右の列を選択するには、それが使用して揃える<<.繰り返すように。ここで見つけました:stackoverflow.com/a/24704379/2152384
pozitron57

1
またはpozitron57 @デ仕事をするマクロをcreaete
アーサージュリアオ

24

sunny256が示唆しているように、このcolumnコマンドはUnix / Linuxマシンでこれを行う優れた方法ですが、純粋なVimで(Windowsでも使用できるように)実行したい場合、最も簡単な方法は、 Alignプラグインを実行してください:

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

1行目はコンマのエントリを揃え、2行目はコンマを移動して、前の値と揃えます。使えるかもしれませんAlignCtrl一度にすべてを行うカスタムマッピングを定義するため、それをどのように使用するか思い出せません...

編集する

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

:%Align ,\zs

LaTeXテーブルで完全に機能します::'<,'>Align &
Thomas

:%Align! lP0 \sl=左揃え、P0=セパレーターの後の0パディング)でも実現できます。
NTD 2014

8

これは、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)



4

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

:%ArrangeColumn

ただし、これはあなたが要求したとおりには実行されません。セルの内容を正しく調整しますが、値は小数点または最初の桁で揃えられます。

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


3

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

:set nowrap
:%!column -t

(debianでは、複数の隣接する区切り文字を分割したい場合、列-nの追加オプションもあることに注意してください)


nowrapの方がずっと良いです。私はあなたの提案を含めました、ありがとう 'コマンドCSVセットnowrap | %!column -t -s '、' `。
ペルー

また、空の列のマージを無効にする-nオプションにも注意してください。stackoverflow.com/questions/1875305/command-line-csv-viewer
ペルー

3

私はこの目的のためにtablignを書いただけです。でインストール

pip3 install tablign --user

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

:'<,'>:!tablign

ここに画像の説明を入力してください



1

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

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

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

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

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

:g(lobal)コマンドの検索語は空のままにしました。ビジュアルブロックを使用してすべての行に影響を与えたかったためですが、ビジュアル選択(および「 '<、'>」)を使用して省略し、代わりにそこに検索用語。または、視覚的な選択と検索用語を組み合わせて、物事をより細かく/簡単に絞り込みます。

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


0

私は、ユーザーがvimの外部でも任意のタイプのテキストを基本的に並べ替えることができるpythonスクリプトを作成しました。これがWindowsまたはMacユーザーのどちらで機能するかは不明です。

columnice.py要旨

vimでの使用法。

:'<,'>!columnice =

これは区切り文字として等号を使用します。デリミタは捨てられません。


0

これは私の.vimrcにあります。

command! CSV set nowrap | %s/,/,|/g | %!column -n -t -s "|" 

これは、カンマを維持しながら列を整列します。これは、後で正しく読み取るために必要になる場合があります。たとえば、Python Pandas read_csv(..., skipinitialspace=True)では、このスマートなオプションについてPandasの皆さんに感謝します%s/,\s\+/,/gcolumnオプション--output-separatorがあるともっと簡単かもしれませんが、私はそうではなく、理由もわかりません(ubuntu 18.04の列の私のmanページに2004とありますが、ubuntuが新しいバージョンを取得するかどうかはわかりません) 。とにかく、これは私にとってはうまくいき、何か提案があればコメントしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.