Pregunta

Tengo este conjunto de datos en un archivo 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

Como se puede ver, los números son un formato diferente y bien alineados.Hay una manera en vim para 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 genial para copiar y pegar secciones con ctrl-v.Cualquier sugerencias?

¿Fue útil?

Solución

Si usa algún tipo de UNIX (Linux, etc.), puede hacer trampa y filtrarlo a través del comando de columna (1).

:%!column -t

Lo anterior se analizará en delimitadores dentro de literales de cadena que es incorrecto, por lo que probablemente necesitará pasos de preprocesamiento y especificar el delimitador para este archivo, por ejemplo:

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

Otros consejos

A veces queremos alinear las dos columnas.En ese caso, no necesitamos ningún plugins y se puede utilizar puro Vim funcionalidad como este:

  1. Elegir un separador.En la OP del post esta es una coma, en mi ejemplo, esta es la =.
  2. Agregar espacios antes o después de ella.Yo uso s/=/= ...spaces... / en la selección visual de este.
  3. Busque la palabra más larga y coloque el cursor después de ella.
  4. Eliminar todos los espacios en blanco extra usando dw y de movimiento vertical.

Ejemplo de esta técnica se muestra a continuación:

Example

Yo no encuentro la necesidad de alinear las cosas con la suficiente frecuencia para instalar otro plugin, así que esta fue mi manera preferida de cumplimiento de la misma - especialmente el hecho de que no requiere mucho pensamiento.

Como sugirió sunny256, el comando column es una excelente manera de hacerlo en máquinas Unix / Linux, pero si quieres hacerlo en Vim puro (para que también se pueda usar en Windows), el más fácil La forma es instalar el Alinear y luego hacer:

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

La primera línea alinea las entradas en las comas y la segunda mueve la coma para que esté alineada con el valor anterior. Es posible que pueda usar AlignCtrl para definir un mapeo personalizado que haga todo de una vez, pero nunca puedo recordar cómo usarlo ...

Editar

Si no le importa dos espacios entre las entradas y desea hacer esto en un comando, también puede hacer:

:%Align ,\zs

Esta es una gran respuesta usando 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|dwjq4@a

Observe el espacio único después del 100i, y el < Esc > significa " presione escape " - no escriba " < Esc > " 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
4@a        -- run the macro 4 times (for the remaining 4 lines)

Puede usar el csv.vim plugin.

:%ArrangeColumn

Sin embargo, esto no hará exactamente lo que ha pedido: ajustará correctamente el contenido de las celdas, mientras que 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.

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

GIF de demostración de su archivo README:

también si tiene columnas muy largas, puede ser útil deshabilitar el ajuste predeterminado

:set nowrap
:%!column -t

(tenga en cuenta que en Debian también tiene una opción adicional para la columna -n que si desea dividir varios delimitadores adyacentes)

Pregunta bastante antigua, pero recientemente aproveché un excelente complemento vim que permite el formateo de tablas sobre la marcha o después de los hechos (según lo requiera su caso de uso):

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

Acabo de escribir tablign para este propósito. Instalar con

[sudo -H] pip3 install tablign

Luego simplemente marque la tabla en vim y haga

:'<,'>:!tablign

 ingrese la descripción de la imagen aquí

Escribí un script de Python que permite a los usuarios hacer una columna básica de cualquier tipo de texto también fuera de vim. No estoy seguro de si esto funcionará para usuarios de Windows o Mac.

columnice.py gist

Uso cuando está en vim.

:'<,'>!columnice =

Esto usará el signo igual como el delímetro. Sin embargo, el delímetro no se tira.

Aquí & # 8217; s una respuesta de script Vim pura, sin complementos, sin macros:

Podría ser más claro comenzar con la solución de mi problema & # 8217; s como ejemplo. Seleccioné las líneas de código que quería afectar, luego usé el siguiente comando (recuerde que ingresar al modo de comando desde el modo visual antepone automáticamente el & # 8220; '& Lt;,' & Gt; & # 8221 ;, por lo que actúa en el rango visual):

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

Excepto que NO escribí & # 8220; < 0d > & # 8221 ;. Puede ingresar caracteres no imprimibles en la línea de comando presionando ctrl-v, luego la tecla que desea escribir. & # 8220; & Lt; 0d & Gt; & # 8221; es lo que se muestra en la línea de comando después de escribir & # 8216; ctrl-v enter & # 8217 ;. Aquí, & # 8217; es analizado por & # 8220; normal & # 8221; comando como la salida de & # 8220; / & # 8221; modo de búsqueda. El cursor salta a & # 8220; valor & # 8221; en la línea actual.

Luego simplemente [D] elegimos el resto de la línea, saltamos a la columna 70 (o lo que sea que necesite en su caso), y [P] ut lo que acabamos de eliminar. Esto significa que tenemos que determinar el ancho de la línea más ancha, hasta nuestra búsqueda. Si no ha & # 8217; t ponga esa información en su línea de estado, puede ver la columna del cursor ingresando el comando de modo normal & # 8216; g ctrl-g & # 8217 ;. También tenga en cuenta que saltar a una columna que no & # 8217; t existe requiere la configuración 'virtualedit'!

Dejé el término de búsqueda para el comando: g (lobal) vacío, ya que usamos un bloque visual y queríamos afectar cada línea, pero puede dejarlo usando una selección visual (y el & # 8220; ' <, '> & # 8221;) y pon un término de búsqueda allí. O combine una selección visual y un término de búsqueda para limitar las cosas con mayor precisión / facilidad.

Aquí & # 8217; es algo que aprendí recientemente: si comete un error en un comando de modo de comando complejo, deshaga con & # 8216; u & # 8217; (si afectó el búfer), luego presione & # 8220; q: & # 8221; para ingresar a un búfer de historial de comando especial que actúa de manera muy similar a un búfer convencional Edite cualquier línea y presione Intro, y el comando modificado se ingresa como un nuevo comando. Indispensable si no & # 8217; no quiere tener que preocuparse por formular todo perfectamente la primera vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top