sformatuj w vimie, aby uzyskać ładny układ kolumn

126

Mam ten zestaw danych w pliku 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

Jak widać, liczby są inaczej sformatowane i źle wyrównane. Czy w vimie jest sposób, aby szybko i poprawnie wyrównać kolumny, tak aby wynik był taki?

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

Byłoby wspaniale skopiować i wkleić sekcje za pomocą ctrl-v. Jakieś wskazówki?

Stefano Borini
źródło

Odpowiedzi:

263

Jeśli korzystasz z jakiegoś systemu UNIX (Linux itp.), Możesz go oszukiwać i filtrować za pomocą polecenia column (1).

:%!column -t

Powyższe przeanalizuje ograniczniki wewnątrz literałów ciągów, co jest nieprawidłowe, więc prawdopodobnie będziesz potrzebować kroków wstępnego przetwarzania i określenia separatora dla tego pliku, na przykład:

%!sed 's/","/\&/' | column -t -s '&'
słoneczny256
źródło
1
Fajne polecenie, nie byłem tego świadomy (pisałem kiedyś własny skrypt w Perlu do wykonywania tego rodzaju operacji).
hlovdal
24
Ponieważ moje pliki nie miały miejsca, którego musiałem użyć :%!column -t -s ','. Usuwa przecinki, więc nie są już technicznymi plikami CSV. Ale pięknie je układa, czego potrzebowałem.
Eduardo,
27
Świetna wskazówka! Wystarczy dodać, że działa również w przypadku :'<,'>!column -t
zaznaczania
2
Czy ktoś zna rozwiązanie do pracy z cytowanymi kolumnami z przecinkami w kolumnie? przykład „2151 Main ST Houston, TX”
metrix
3
@metrix, tutaj jest bardzo niezdarne obejście: 1) zamień spacje wewnątrz ograniczników na inny znak, 2) następnie uruchom columnzgodnie z opisem w poście, 3) następnie zamień ograniczniki z powrotem na spacje. Przykładowa komenda w trybie wizualnym dla kroku 1 to:'<,'>s/"\(\w\+\) \(\w\+\)"/"\1_\2"/g
Luciano,
54

Czasami chcemy wyrównać tylko dwie kolumny. W takim przypadku nie potrzebujemy żadnych wtyczek i możemy używać czystej funkcjonalności Vima w następujący sposób:

  1. Wybierz separator. W poście OP jest to przecinek, w moim przykładzie to jest =.
  2. Dodaj spacje przed / po nim. Używam s/=/= ...spaces... /do tego wizualnej selekcji.
  3. Znajdź najdłuższe słowo i umieść po nim kursor.
  4. Usuń wszystkie dodatkowe spacje za pomocą dwi ruchu pionowego.

Przykład tej techniki przedstawiony poniżej:

Przykład

Nie wydaje mi się, że muszę wyrównywać rzeczy wystarczająco często, aby zainstalować kolejną wtyczkę, więc był to mój ulubiony sposób na osiągnięcie tego - zwłaszcza, że ​​nie wymaga to zbytniego myślenia.

rr-
źródło
4
Jak zrobiłeś ten fajny gif?
Stefano Borini
1
blog.bahraniapps.com/gifcam niestety wygląda na to, że jest to narzędzie tylko dla systemu Windows.
rr-
Po zakończeniu wyrównywania górnej części, w jaki sposób przesunąłeś kursor na środek ekranu, a następnie zacząłeś wyrównywać dolną część?
cychoi
5
Po :s/=/ =/tym lepiej jest użyć, Ctrl + Vaby wybrać odpowiednią kolumnę, a następnie wyrównać ją za pomocą <<i .powtórzyć. Znalazłem to tutaj: stackoverflow.com/a/24704379/2152384
pozitron57
1
Lub utwórz makro do wykonania pracy @ pozitron57
Arthur Julião
24

Jak zasugerował sunny256, columnpolecenie to świetny sposób na zrobienie tego na maszynach Unix / Linux, ale jeśli chcesz to zrobić w czystym Vimie (aby można go było używać również w systemie Windows), najłatwiej jest zainstalować narzędzie Align plugin, a następnie wykonaj:

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

Pierwsza linia wyrównuje wpisy w przecinkach, a druga przenosi przecinek tak, aby był wyrównany z poprzednią wartością. Możesz użyć AlignCtrldo zdefiniowania niestandardowego mapowania, które robi wszystko za jednym razem, ale nigdy nie pamiętam, jak go używać ...

Edytować

Jeśli nie przeszkadzają Ci dwie spacje między wpisami i chcesz to zrobić jednym poleceniem, możesz również:

:%Align ,\zs
DrAl
źródło
Działa idealnie w tabeli LaTeX::'<,'>Align &
Thomas
Można to również osiągnąć za pomocą :%Align! lP0 \s( l= wyrównanie do lewej, P0wypełnienie = 0 po separatorze).
ntd
8

To świetna odpowiedź przy użyciu makr vima: https://stackoverflow.com/a/8363786/59384 - w zasadzie zaczynasz nagrywać makro, formatujesz pierwszą kolumnę, zatrzymujesz nagrywanie, a następnie powtarzasz makro dla wszystkich pozostałych wierszy.

Skopiuj / wklej z tej odpowiedzi:

qa0f:w100i <Esc>19|dwjq4@a

Zwróć uwagę na pojedynczą spację po 100i, a <Esc> oznacza „naciśnij klawisz Escape” - nie wpisuj „<Esc>” dosłownie.

Tłumaczenie:

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
źródło
7

Mamy teraz również wspaniałą wtyczkę EasyAlign , napisaną przez junegunn.

Demonstracyjny plik GIF z pliku README:

rr-
źródło
4

Możesz użyć wtyczki csv.vim .

:%ArrangeColumn

Jednak nie przyniesie to dokładnie tego, o co prosiłeś: odpowiednio dostosuje zawartość komórek, podczas gdy twoje wartości są wyrównane do przecinka dziesiętnego lub do pierwszej cyfry.

Wtyczka zawiera wiele innych przydatnych poleceń do pracy z plikami CSV.

Daan
źródło
3

również jeśli masz bardzo długie kolumny, przydatne może być wyłączenie domyślnego zawijania

: ustaw nowrap
:%! kolumna -t

(uwaga w debianie masz również dodatkową opcję dla kolumny -n, która, jeśli chcesz podzielić wiele sąsiednich ograniczników)

Amos Folarin
źródło
znacznie lepiej z nowrapem. Dołączyłem twoją sugestię, dziękuję 'polecenie CSV set nowrap | %! kolumna -t -s ',' ``.
Peruz
zwróć także uwagę na opcję -n, która wyłącza scalanie pustych kolumn. stackoverflow.com/questions/1875305/command-line-csv-viewer
Peruz
3

Właśnie napisałem tablign w tym celu. Zainstaluj za pomocą

pip3 install tablign --user

Następnie po prostu zaznacz tabelę w vimie i zrób

:'<,'>:!tablign

wprowadź opis obrazu tutaj

Nico Schlömer
źródło
1

Dość stare pytanie, ale ostatnio skorzystałem z doskonałej wtyczki vim, która umożliwia formatowanie tabel w locie lub po fakcie (zgodnie z Twoim przypadkiem użycia):

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

Alice
źródło
1

Oto czysta odpowiedź skryptu Vima, bez wtyczek, bez makr:

Najlepiej byłoby zacząć od rozwiązania mojego problemu jako przykładu. Wybrałem linie kodu, na które chciałem wpłynąć, a następnie użyłem następującego polecenia (przypomnij sobie, że wejście w tryb poleceń z trybu wizualnego automatycznie poprzedza „'<,'>”, więc działa na zakres wizualny):

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

Z wyjątkiem tego, że faktycznie NIE wpisałem „<0d>”. Znaki niedrukowalne można wprowadzić w wierszu poleceń, naciskając ctrl-v, a następnie klawisz, który chcesz wpisać. „<0d>” jest tym, co jest renderowane w wierszu poleceń po wpisaniu „ctrl-v enter”. Tutaj jest analizowany przez „normalne” polecenie jako wyjście z trybu wyszukiwania „/”. Następnie kursor przeskakuje do „wartości” w bieżącym wierszu.

Następnie po prostu [D] usuwamy resztę wiersza, przeskakujemy do kolumny 70 (lub czegokolwiek potrzebujesz w twoim przypadku) i [P] utnij to, co właśnie usunęliśmy. Oznacza to, że musimy określić szerokość najszerszej linii, aż do naszego wyszukiwania. Jeśli nie umieściłeś tych informacji w linii statusu, możesz zobaczyć kolumnę kursora, wprowadzając polecenie trybu normalnego „g ctrl-g”. Zwróć także uwagę, że przejście do kolumny, która nie istnieje, wymaga ustawienia „virtualedit”!

Zostawiłem wyszukiwany termin dla polecenia: g (lobal) pusty, ponieważ użyliśmy bloku wizualnego i chcieliśmy wpłynąć na każdą linię, ale możesz zakończyć, używając zaznaczenia wizualnego (i „'<,'>”) i wstawić zamiast tego wyszukiwane hasło. Lub połącz selekcję wizualną i wyszukiwane hasło, aby precyzyjniej / łatwiej zawęzić zakres.

Oto coś, czego ostatnio się nauczyłem: jeśli pomylisz się przy złożonym poleceniu trybu poleceń, cofnij za pomocą „u” (jeśli wpłynęło to na bufor), a następnie naciśnij „q:”, aby wprowadzić specjalny bufor historii poleceń, który działa podobnie jak konwencjonalny bufor . Edytuj dowolny wiersz i naciśnij klawisz Enter, a zmienione polecenie zostanie wprowadzone jako nowe polecenie. Niezastąpiony, jeśli nie chcesz się stresować, że za pierwszym razem wszystko idealnie ułożysz.

atimholt
źródło
0

Napisałem skrypt w Pythonie, który pozwala użytkownikom na kolumizację dowolnego typu tekstu również poza vimem. Nie jestem pewien, czy to zadziała dla użytkowników systemu Windows lub Mac.

columnice.py sedno

Użycie w vimie.

:'<,'>!columnice =

Spowoduje to użycie znaku równości jako separatora. Ogranicznik nie jest jednak odrzucany.

Bassim Huis
źródło
0

Mam to w moim .vimrc.

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

Spowoduje to wyrównanie kolumn, zachowując przecinek, który może być później potrzebny do poprawnego czytania. Na przykład, dzięki Python Pandas read_csv(..., skipinitialspace=True), dziękuję chłopakom z Pandy za tę inteligentną opcję, w przeciwnym razie w vimie %s/,\s\+/,/g. Może być łatwiej, jeśli masz columnopcję --output-separator. Myślę, że moja nie działa i nie jestem pewien dlaczego (moja strona podręcznika dla kolumny mówi 2004, na ubuntu 18.04, nie jestem pewien, czy ubuntu otrzyma nową wersję) . W każdym razie to działa dla mnie i skomentuj, jeśli masz jakieś sugestie.

Peruz
źródło