2009-08-04 22 views
99

que tiene este conjunto de datos en un archivo csvcambio de formato en vim para un buen diseño de columna

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 

Como se puede ver, los números tienen un formato diferente y desalineada. ¿Hay alguna manera en vim alinear rápidamente las columnas correctamente, por lo que el resultado es este

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 

que sería grande para copiar y pegar secciones con ctrl-v. ¿Algún consejo?

Respuesta

215

Si estás en algún tipo de UNIX (Linux, etc.), se puede engañar y filtrarla a través de la columna (1) de comandos:

:%!column -t 
+1

comando fresca, yo no era consciente de ello (después de haber escrito script personalizado perl para hacer ese tipo de operación en el pasado). – hlovdal

+0

Para obtener más control, inserté pestañas (podría ser un símbolo no utilizado) en el archivo para marcar las columnas mediante sustitución, y luego ejecuté:%!column -t -s "^ I" para tabular (Cv, pestaña inserta un carácter de tabulación literal -^I) –

+14

Como mis archivos no tienen espacio, tuve que usar ':%! column -t -s ',' '. Quita las comas, por lo que ya no son técnicamente archivos csv. Pero los arregla maravillosamente, que es lo que necesitaba. – Eduardo

24

Como sugirió sunny256, el comando es un gran column La manera más fácil es instalar el complemento Align y luego hacer:

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

La primera línea alinea las entradas de las comas y la segunda mueve th e coma para que esté a nivel con el valor anterior. Es posible que pueda utilizar AlignCtrl para definir una asignación personalizada que hace todo el lote de una sola vez, pero nunca puede recordar cómo usarlo ...

Editar

Si no te importa dos espacios entre las entradas y que quiere hacer esto en un solo comando, también se pueden hacer:

:%Align ,\zs 
+0

Funciona perfectamente en una tabla LaTeX: ': '<,'> Alinear &' – Thomas

+0

Puede realizarse también con ':% Align! lP0 \ s' ('l' = alineado a la izquierda,' P0' = 0 relleno después del separador). – ntd

1

también si tiene columnas muy largas que pueden ser útiles para deshabilitar por defecto envolver

 
:set nowrap 
:%!column -t 

(nota en debian también tiene una opción adicional para la columna -n que, si se desea dividir múltiples delimitadores adyacentes)

2

usted podría utilizar el plugin csv.vim.

:%ArrangeColumn 

Sin embargo, esto no va a hacer exactamente lo que has pedido: se ajustará a la derecha el contenido de las células, mientras que usted tiene sus valores alineados por el punto decimal o por el primer dígito.

El complemento tiene muchos otros comandos útiles para trabajar con archivos CSV.

6

Esta es una excelente respuesta al usar macros vim: https://stackoverflow.com/a/8363786/59384 - básicamente, comienza a grabar una macro, formatea la primera columna, detiene la grabación y luego repite la macro para todas las líneas restantes.

Copiar/pegar de esa respuesta:

qa0f:w100i <Esc>19|[email protected] 

Observa el espacio solo después de que el 100i, y los medios "de prensa de escape" - no se escribe "", literalmente.

Traducción:

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 
[email protected]  -- run the macro 4 times (for the remaining 4 lines) 
0

me escribió un script en Python que permite a los usuarios básicamente columize cualquier tipo de texto también fuera de vim. No estoy seguro si esto funcionará para usuarios de Windows o Mac.

columnice.py gist

uso cuando en vim.

:'<,'>!columnice = 

Esto utilizará el signo igual como el delímetro. Sin embargo, el delímetro no se descarta.

41

A veces queremos alinear solo dos columnas. En ese caso, no necesitamos ningún complemento y podemos usar la funcionalidad Vim pura como esta:

  1. Elija un separador. En la publicación de OP, esta es una coma, en mi ejemplo esto es =.
  2. Agregue espacios antes/después de él. Yo uso s/=/= ...spaces... / en la selección visual para esto.
  3. Busque la palabra más larga y coloque el cursor después de ella.
  4. Elimine todos los espacios en blanco adicionales utilizando dw y movimiento vertical.

ejemplo de esta técnica se demuestra a continuación:

Example

no me encuentro que necesitan para alinear las cosas a menudo suficientes para instalar otro plugin, así que esto era mi forma preferida de llevar a cabo - sobre todo que no requiere mucho pensamiento.

+3

¿Cómo hiciste ese buen gif? –

+1

http://blog.bahraniapps.com/gifcam/ lamentablemente, parece que es una herramienta solo para Windows. –

+0

Cuando terminó de alinear la parte superior, ¿cómo movió el cursor al centro de la pantalla y luego comenzó a alinear la parte inferior? – cychoi

1

Ahora también tenemos el fabuloso plugin EasyAlign, escrito por junegunn.

Demostración GIF de su README:

0

que acabo de escribir tablify para este propósito. Instalar con

[sudo -H] pip3 install tablify 

Después, simplemente marque la tabla en vim y hacer

:'<,'>:!tablify 

enter image description here

Cuestiones relacionadas