Domanda

Ho questo set di dati in un file 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

Come puoi vedere, i numeri sono formattati in modo diverso e disallineati. Esiste un modo per allineare rapidamente le colonne correttamente, in modo che il risultato sia questo

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

Sarebbe fantastico copiare e incollare sezioni con ctrl-v. Qualche suggerimento?

È stato utile?

Soluzione

Se utilizzi un tipo di UNIX (Linux, ecc.), puoi imbrogliare e filtrarlo tramite il comando column (1).

:%!column -t

Quanto sopra analizzerà i delimitatori all'interno dei valori letterali delle stringhe che sono errati, quindi probabilmente avrai bisogno di pre-elaborazione e specificando il delimitatore per questo file, ad esempio:

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

Altri suggerimenti

A volte vogliamo allineare solo due colonne. In tal caso, non abbiamo bisogno di alcun plug-in e possiamo usare la funzionalità Vim pura come questa:

  1. Scegli un separatore. Nel post di OP questa è una virgola, nel mio esempio questa è =.
  2. Aggiungi spazi prima / dopo. Per questo uso s/=/= ...spaces... / nella selezione visiva.
  3. Individua la parola più lunga e posiziona il cursore dopo di essa.
  4. Rimuovi tutto lo spazio bianco extra usando dw e il movimento verticale.

Esempio di questa tecnica dimostrato di seguito:

Esempio

Non mi trovo a dover allineare le cose abbastanza spesso per installare un altro plugin, quindi questo è stato il mio modo preferito di realizzarlo - specialmente che non richiede molto pensiero.

Come suggerito sunny256, il comando column è un ottimo modo per farlo su macchine Unix / Linux, ma se vuoi farlo in puro Vim (in modo che possa essere usato anche in Windows), il più semplice il modo è installare il Allinea e quindi fare:

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

La prima riga allinea le voci sulle virgole e la seconda sposta la virgola in modo che sia a filo con il valore precedente. Potresti essere in grado di utilizzare AlignCtrl per definire una mappatura personalizzata che fa l'intero lotto in una volta, ma non riesco mai a ricordare come usarla ...

Modifica

Se non ti dispiace due spazi tra le voci e vuoi farlo in un solo comando, puoi anche fare:

:%Align ,\zs

Questa è un'ottima risposta usando le macro vim: https://stackoverflow.com/a/8363786/59384 - in pratica, inizi a registrare una macro, formatta la prima colonna, interrompi la registrazione e ripeti la macro per tutte le righe rimanenti.

Copia / incollato da quella risposta:

qa0f:w100i <Esc>19|dwjq4@a

Nota il singolo spazio dopo 100i e < Esc > significa " premere escape " - non digitare " < Esc > " letteralmente.

Traduzione:

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)

Puoi usare il plug-in csv.vim .

:%ArrangeColumn

Tuttavia, questo non farà esattamente ciò che ti è stato chiesto: regolerà correttamente il contenuto delle celle, mentre i tuoi valori saranno allineati con il punto decimale o con la prima cifra.

Il plugin ha molti altri comandi utili per lavorare con i file CSV.

Ora abbiamo anche il favoloso plug-in EasyAlign , scritto da junegunn.

GIF dimostrativa dal suo README:

anche se hai colonne molto lunghe può essere utile disabilitare il wrapping predefinito

:set nowrap
:%!column -t

(nota in debian hai anche un'ulteriore opzione per la colonna -n che se vuoi dividere più delimitatori adiacenti)

Domanda piuttosto vecchia, ma recentemente mi sono avvalso di un eccellente plug-in VIM che consente la formattazione della tabella al volo o dopo il fatto (come richiede il tuo caso d'uso):

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

Ho appena scritto tablign a questo scopo. Installa con

[sudo -H] pip3 install tablign

Quindi segna semplicemente la tabella in vim e fai

:'<,'>:!tablign

 inserisci qui la descrizione dell'immagine

Ho scritto uno script in Python che consente agli utenti di scrivere in modo basilare qualsiasi tipo di testo anche al di fuori di VIM. Non sono sicuro che funzionerà per utenti Windows o Mac.

columnice.py gist

Utilizzo in vim.

:'<,'>!columnice =

Questo utilizzerà il segno di uguale come delimitatore. Il delimitatore non viene gettato via.

Qui & # 8217; s una risposta di script Vim pura, nessun plugin, nessuna macro:

Potrebbe essere più chiaro iniziare con la mia soluzione del problema & come esempio. Ho selezionato le righe di codice che volevo influenzare, quindi ho usato il comando seguente (ricorda che l'accesso alla modalità di comando dalla modalità visiva antepone automaticamente & # 8220; '& Lt;,' & Gt; & # 8221 ;, quindi agisce sul campo visivo):

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

Tranne il fatto che NON ho effettivamente digitato & # 8220; < 0d > & # 8221 ;. È possibile inserire caratteri non stampabili sulla riga di comando premendo ctrl-v, quindi il tasto che si desidera digitare. # 8220 &; & Lt; gt 0d &; & # 8221; è ciò che viene visualizzato sulla riga di comando dopo aver digitato & # 8216; ctrl-v immettere & # 8217 ;. Qui, & # 8217; s analizzato da & # 8220; normale & # 8221; comando come uscita da & # 8220; / & # 8221; modalità di ricerca. Il cursore quindi passa a & # 8220; & Valore # 8221; nella riga corrente.

Quindi semplicemente [D] elimina il resto della riga, passa alla colonna 70 (o qualsiasi altra cosa di cui hai bisogno nel tuo caso) e [P] ut quello che abbiamo appena eliminato. Ciò significa che dobbiamo determinare la larghezza della linea più ampia, fino alla nostra ricerca. Se non hai & # 8217; t metti queste informazioni nella tua statusline, puoi vedere la colonna del cursore inserendo il comando in modalità normale & # 8216; g ctrl-g & # 8217 ;. Nota anche che saltare a una colonna che non & # 8217; t esiste richiede l'impostazione 'virtualedit'!

Ho lasciato vuoto il termine di ricerca per il comando: g (lobal), dal momento che abbiamo usato un blocco visivo e volevamo influenzare ogni riga, ma puoi interrompere usando una selezione visiva (e il & # 8220; ' <, '> & # 8221;) e inserisci invece un termine di ricerca. Oppure combina una selezione visiva e un termine di ricerca per restringere le cose in modo più fine / semplice.

Qui & # 8217; s qualcosa che ho imparato di recente: se sbagli su un comando in modalità comando complesso, annulla con & # 8216; u & # 8217; (se ha influito sul buffer), quindi premere & # 8220; q: & # 8221; per immettere uno speciale buffer della cronologia dei comandi che si comporta in modo molto simile a un buffer convenzionale. Modifica qualsiasi riga e premi invio e il comando modificato viene inserito come nuovo comando. Indispensabile se non vuoi & # 8217; non devi stressarti a formulare tutto perfettamente la prima volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top