Formatieren Sie in vim neu, um ein schönes Spaltenlayout zu erhalten

126

Ich habe diesen Datensatz in einer CSV-Datei

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

Wie Sie sehen können, sind die Zahlen unterschiedlich formatiert und falsch ausgerichtet. Gibt es in vim eine Möglichkeit, die Spalten schnell richtig auszurichten, so dass das Ergebnis dies ist?

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

Das wäre großartig, um Abschnitte mit Strg-V zu kopieren und einzufügen. Irgendwelche Hinweise?

Stefano Borini
quelle

Antworten:

263

Wenn Sie unter UNIX (Linux usw.) arbeiten, können Sie es betrügen und über den Befehl column (1) filtern.

:%!column -t

Das oben Gesagte analysiert Trennzeichen in Zeichenfolgenliteralen, was falsch ist. Daher müssen Sie wahrscheinlich Vorverarbeitungsschritte ausführen und das Trennzeichen für diese Datei angeben, z. B.:

%!sed 's/","/\&/' | column -t -s '&'
sunny256
quelle
1
Cooler Befehl, ich war mir dessen nicht bewusst (nachdem ich in der Vergangenheit ein benutzerdefiniertes Perl-Skript geschrieben hatte, um diese Art von Operation auszuführen).
Hlovdal
24
Da meine Dateien keinen Speicherplatz hatten, musste ich sie verwenden :%!column -t -s ','. Es werden die Kommas entfernt, sodass es sich nicht mehr um technische CSV-Dateien handelt. Aber arrangiert sie wunderschön, was ich brauchte.
Eduardo
27
Toller Tipp! Nur hinzufügen, es funktioniert auch für die visuelle Auswahl mit:'<,'>!column -t
freitass
2
Kennt jemand eine Lösung, um mit Spalten in Anführungszeichen mit Kommas in der Spalte zu arbeiten? Beispiel "2151 Main ST Houston, TX"
Metrix
3
@metrix, hier ist eine sehr umständliche Problemumgehung : 1) Konvertieren Sie Leerzeichen in Trennzeichen in ein anderes Zeichen, 2) führen Sie sie columnwie im Beitrag beschrieben aus, 3) ersetzen Sie Ihre Trennzeichen wieder in Leerzeichen. Ein Beispielbefehl im visuellen Modus für Schritt 1 ist:'<,'>s/"\(\w\+\) \(\w\+\)"/"\1_\2"/g
Luciano
54

Manchmal möchten wir nur zwei Spalten ausrichten. In diesem Fall benötigen wir keine Plugins und können die reine Vim-Funktionalität wie folgt verwenden:

  1. Wählen Sie ein Trennzeichen. In OPs Post ist dies ein Komma, in meinem Beispiel ist dies =.
  2. Fügen Sie Leerzeichen davor / danach hinzu. Ich benutze dafür die s/=/= ...spaces... /visuelle Auswahl.
  3. Suchen Sie das längste Wort und setzen Sie den Cursor danach.
  4. Entfernen Sie alle zusätzlichen Leerzeichen mit dwund vertikaler Bewegung.

Beispiel dieser Technik unten gezeigt:

Beispiel

Ich muss die Dinge nicht oft genug ausrichten, um ein anderes Plugin zu installieren, daher war dies meine bevorzugte Methode, um dies zu erreichen - insbesondere, dass es nicht viel Nachdenken erfordert.

rr-
quelle
4
Wie hast du das schöne GIF gemacht?
Stefano Borini
1
blog.bahraniapps.com/gifcam sieht leider so aus, als wäre es ein Windows-Tool.
rr-
Wie haben Sie nach dem Ausrichten des oberen Teils den Cursor in die Mitte des Bildschirms bewegt und dann mit dem Ausrichten des unteren Teils begonnen?
Cychoi
5
Nachdem :s/=/ =/es viel besser ist Ctrl + V, die rechte Spalte auszuwählen, richten Sie sie mit <<und .wiederholen. Fand es hier: stackoverflow.com/a/24704379/2152384
pozitron57
1
Oder erstellen Sie ein Makro für de job @ pozitron57
Arthur Julião
24

Wie sunny256 vorgeschlagen hat, ist der columnBefehl eine großartige Möglichkeit, dies auf Unix / Linux-Computern zu tun. Wenn Sie ihn jedoch in reinem Vim ausführen möchten (damit er auch in Windows verwendet werden kann), ist es am einfachsten, Align zu installieren Plugin und dann machen:

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

In der ersten Zeile werden die Einträge in den Kommas ausgerichtet, und in der zweiten Zeile wird das Komma so verschoben, dass es mit dem vorhergehenden Wert übereinstimmt. Sie können möglicherweise AlignCtrlein benutzerdefiniertes Mapping definieren, das die gesamte Menge auf einmal erledigt, aber ich kann mich nie erinnern, wie ich es verwenden soll ...

Bearbeiten

Wenn Ihnen zwei Leerzeichen zwischen den Einträgen nichts ausmachen und Sie dies in einem Befehl tun möchten, können Sie auch Folgendes tun:

:%Align ,\zs
DrAl
quelle
Funktioniert perfekt in einer LaTeX-Tabelle::'<,'>Align &
Thomas
Dies kann auch mit :%Align! lP0 \s( l= linksbündig, P0= 0 Polsterung nach dem Trennzeichen) erreicht werden.
ntd
8

Dies ist eine großartige Antwort mit vim-Makros: https://stackoverflow.com/a/8363786/59384 - im Grunde beginnen Sie mit der Aufzeichnung eines Makros, formatieren die erste Spalte, beenden die Aufzeichnung und wiederholen das Makro für alle verbleibenden Zeilen.

Von dieser Antwort kopieren / einfügen:

qa0f:w100i <Esc>19|dwjq4@a

Beachten Sie das einzelne Leerzeichen nach dem 100i, und <Esc> bedeutet "Escape drücken" - geben Sie "<Esc>" nicht wörtlich ein.

Übersetzung:

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)
zcrar70
quelle
7

Wir haben jetzt auch das fabelhafte EasyAlign- Plugin von junegunn.

Demonstrations-GIF aus der README-Datei:

rr-
quelle
4

Sie können das Plugin csv.vim verwenden .

:%ArrangeColumn

Dies wird jedoch nicht genau das tun, was Sie gefragt haben: Es wird den Inhalt von Zellen richtig anpassen, während Sie Ihre Werte durch den Dezimalpunkt oder durch die erste Ziffer ausgerichtet haben.

Das Plugin enthält viele weitere nützliche Befehle zum Arbeiten mit CSV-Dateien.

Daan
quelle
3

Auch wenn Sie sehr lange Spalten haben, kann es nützlich sein, die Standardumhüllung zu deaktivieren

: set nowrap
:%! Spalte -t

(Beachten Sie, dass Sie im Debian auch eine weitere Option für die Spalte -n haben, die Sie verwenden können, wenn Sie mehrere benachbarte Trennzeichen aufteilen möchten.)

Amos Folarin
quelle
viel besser mit nowrap. Ich habe Ihren Vorschlag aufgenommen, danke 'Befehl CSV set nowrap | %! column -t -s ',' `.
Peruz
Beachten Sie auch die Option -n, um das Zusammenführen leerer Spalten zu deaktivieren. stackoverflow.com/questions/1875305/command-line-csv-viewer
Peruz
3

Ich habe gerade Tablign für diesen Zweck geschrieben. Installieren mit

pip3 install tablign --user

Dann markieren Sie einfach die Tabelle in vim und tun

:'<,'>:!tablign

Geben Sie hier die Bildbeschreibung ein

Nico Schlömer
quelle
1

Ziemlich alte Frage, aber ich habe kürzlich ein hervorragendes Vim-Plugin verwendet, das die Tabellenformatierung entweder im laufenden Betrieb oder nachträglich ermöglicht (je nach Anwendungsfall):

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

Alice
quelle
1

Hier ist eine reine Vim-Skriptantwort, keine Plugins, keine Makros:

Es ist vielleicht am klarsten, mit der Lösung meines Problems als Beispiel zu beginnen. Ich habe die Codezeilen ausgewählt, die ich beeinflussen möchte, und dann den folgenden Befehl verwendet (denken Sie daran, dass beim Aufrufen des Befehlsmodus aus dem visuellen Modus automatisch das "<, '>" vorangestellt wird, damit es auf den visuellen Bereich wirkt):

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

Außer ich habe NICHT "<0d>" eingegeben. Sie können nicht druckbare Zeichen in die Befehlszeile eingeben, indem Sie Strg-V und dann die Taste drücken, die Sie eingeben möchten. "<0d>" wird in der Befehlszeile gerendert, nachdem ich "Strg-V-Eingabe" eingegeben habe. Hier wird es durch den Befehl "normal" als Verlassen des Suchmodus "/" analysiert. Der Cursor springt dann in der aktuellen Zeile auf „Wert“.

Dann löschen wir einfach [D] den Rest der Zeile, springen zu Spalte 70 (oder was auch immer Sie in Ihrem Fall benötigen) und [P] ut, was wir gerade gelöscht haben. Dies bedeutet, dass wir bis zu unserer Suche die Breite der breitesten Linie bestimmen müssen. Wenn Sie diese Informationen nicht in Ihre Statuszeile eingefügt haben, können Sie die Spalte des Cursors anzeigen, indem Sie den Normalmodusbefehl 'g ctrl-g' eingeben. Beachten Sie auch, dass für das Springen zu einer nicht vorhandenen Spalte die Einstellung 'virtualedit' erforderlich ist!

Ich habe den Suchbegriff für den Befehl: g (lobal) leer gelassen, da wir einen visuellen Block verwendet haben und jede Zeile beeinflussen wollten, aber Sie können mit einer visuellen Auswahl (und dem "<, '>") aufhören und setzen dort stattdessen ein Suchbegriff. Oder kombinieren Sie eine visuelle Auswahl und einen Suchbegriff, um die Dinge feiner / einfacher einzugrenzen.

Folgendes habe ich kürzlich gelernt: Wenn Sie einen komplexen Befehlsmodus-Befehl durcheinander bringen, machen Sie ihn mit 'u' rückgängig (wenn er den Puffer beeinflusst), und drücken Sie dann "q:", um einen speziellen Befehlsverlaufspuffer einzugeben, der sich ähnlich wie ein herkömmlicher Puffer verhält . Bearbeiten Sie eine beliebige Zeile und drücken Sie die Eingabetaste. Der geänderte Befehl wird als neuer Befehl eingegeben. Unverzichtbar, wenn Sie sich beim ersten Mal nicht darum kümmern müssen, alles perfekt zu formulieren.

atimholt
quelle
0

Ich habe ein Python-Skript geschrieben, mit dem Benutzer jede Art von Text auch außerhalb von vim grundsätzlich kolumieren können. Ich bin mir nicht sicher, ob dies für Windows- oder Mac-Benutzer funktioniert.

columnice.py Kern

Verwendung in vim.

:'<,'>!columnice =

Dadurch wird das Gleichheitszeichen als Begrenzer verwendet. Der Delimeter wird jedoch nicht weggeworfen.

Bassim Huis
quelle
0

Ich habe das in meiner .vimrc.

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

Dadurch werden die Spalten ausgerichtet, wobei das Komma beibehalten wird. Dies kann später für das korrekte Lesen erforderlich sein. Zum Beispiel mit Python Pandas read_csv(..., skipinitialspace=True), danke Pandas Jungs für diese clevere Option, sonst in vim %s/,\s\+/,/g. Es kann einfacher sein, wenn Sie columndie Option haben - Output-Separator Ich denke, meine nicht und ich bin nicht sicher warum (meine Manpage für Spalte sagt 2004, auf Ubuntu 18.04, nicht sicher, ob Ubuntu eine neue Version bekommen wird). . Wie auch immer, das funktioniert bei mir und kommentiere, wenn du irgendwelche Vorschläge hast.

Peruz
quelle