Edición de archivos CSV en Ubuntu [cerrado]

9

¿Cuál es una buena manera de editar archivos CSV en Ubuntu?

Los archivos se parecen a esto:

This,is,data,with,a,header
2,2,3,4,,
1,,3,,6,6
,5,3,5,5,6
1,2,,,,
1,2,3,4,8,6
1,,9,,5,9
-1,,3,4,5,6
1,2,0,4,5,6

He estado usando OpenOffice, pero se requieren unos 5 clics para desactivar el comportamiento predeterminado de citar todos los campos.

Me gustaría encontrar algo ligero y fácil de usar que permita insertar / eliminar datos y ordenar por columnas.

Andrew Wood
fuente

Respuestas:

3

Para vim, hay un buen complemento csv.vim .

ott--
fuente
Acabo de llegar de ese plugin buscando una alternativa. Tiene un gran problema de rendimiento cuando los csv son "más grandes"; actualmente realiza un bucle para un csv que tiene 500 líneas.
k0pernikus
2

Puede usar gnumeric para este fin. En mi sistema (Crunchbang) y con un archivo tan pequeño como en su ejemplo, el bloc de notas consume aproximadamente 2M de RAM; gnumeric, 4M; y scalc (de LibreOffice), 34M. Gnumeric claramente está en el extremo liviano, y debería detectar su separador correctamente al abrir el archivo.

Pero (hay un pero ...) gnumeric no le permitirá guardar el archivo modificado sin pasar por un obstáculo de menús. Lo que sigue es un script BASH para arreglar esto. El script se basa en xsel (un administrador de portapapeles liviano de línea de comandos) para pegar el contenido modificado de la hoja de cálculo en su archivo. Si se obtiene (no se ejecuta), este script le da acceso a dos funciones, gn para abrir el archivo en gnumeric:

gn filename

y gp para pegar el contenido nuevamente en el archivo y cerrar gnumeric:

gp

(Personalmente, obtengo este script en mi .bashrc para tener las funciones gn y gp disponibles cada vez que abro un terminal).

#! /bin/bash

# once sourced by the shell, this script provides two functions:

# gn        to open a file with gnumeric
# gp        to update the file with gnumeric's selection

# requires grep, sed, awk, and the xsel utility


# name of the target file: used in gn () and gp ()
# ==================================================
gn_file=

# take note of target file and open it with gnumeric if not already opened
# ==================================================
gn () {
    # sanity checks
    if [[ -z $1 ]]; then
        echo 'Usage: gn file'
        return
    fi
    if ! [[ -f $1 && -r $1 ]]; then
        echo "Cannot find/use $1"
        return
    fi
    # yes, this is right; job report, if any, has "$gn_file" not expanded
    if jobs -l | grep 'Running.* gnumeric "$gn_file"' > /dev/null; then
        echo 'Already editing with gnumeric.'
        return
    fi
    echo 'Once done, select the part of the spreadsheet you want to save,'
    echo 'press Ctrl-C, go back to the command line, and type gp [ENTER].'
    # do the job
    gn_file=$1
    gnumeric "$gn_file" &
}

# paste selection into target file and close gnumeric
# ==================================================
gp () {
    # sanity checks
    if [[ -z $gn_file || ! -f $gn_file ]]; then
        echo 'Cannot find/use target file.'
        return
    fi
    local gnumeric_job=$( jobs -l | grep 'Running.* gnumeric "$gn_file"' )
    if [[ -z $gnumeric_job ]]; then
        echo 'No gnumeric instance to paste from.'
        return
    fi
    if [[ -z $( xsel -ob ) ]]; then
        echo 'Nothing to paste.'
        return
    fi
    local temp_file=$( mktemp "$PWD/temp.XXXXXX" )
    # paste X selection (o = output, b = clipboard mode)
    xsel -ob > "$temp_file"
    # replace tabs to get a CSV file
    local tab=$'\t'
    sed --in-place "s/$tab/,/g" "$temp_file"
    # must close gnumeric before updating file
    local job_id=$( echo "$gnumeric_job" | awk '{print $2}' )
    kill "$job_id"
    mv --backup "$temp_file" "$gn_file"
    echo "$gn_file updated."
}

Como el script mismo le dirá al abrir su archivo con gnumeric, cuando haya terminado con su edición, debe seleccionar la parte de la hoja de cálculo que desea guardar antes de presionar Ctr-C (para copiar esta parte en el portapapeles). Volviendo a la línea de comando (Alt-Tab), ingresando gp actualizará su archivo con el contenido del portapapeles y cerrará gnumeric. Sus valores modificados no tendrán comillas a su alrededor, pero estarán separados por pestañas; por lo tanto, el script usa sed para reemplazar las pestañas por comas.

He encontrado que esta es una manera eficiente de trabajar en archivos de datos CSV desde la línea de comandos. La secuencia de comandos debe guardar el archivo correctamente siempre que no contenga pestañas dentro de los campos separados por comas (que parece ser el caso en su ejemplo de análisis de datos).

François Tonneau
fuente
1

Sé a qué te refieres con {Libre, Open} Office. TBH, nunca he encontrado nada realmente bueno en Linux que también sea liviano.

El "mejor" (sí, en citas irónicas) que he encontrado hasta ahora es una aplicación de Java llamada csveditor. Es bastante limpia, pero realmente no sigue las mejores pautas de IU.

Rich Homolka
fuente
0

Yo uso DMcsvEditor . Es rápido y liviano, y tiene algunas opciones útiles básicas.

agregado 1166877
fuente
Parece que el DMcsvEditor se convirtió en CSVpad
Youda008
0

Estoy usando phpstorm y tengo que lidiar mucho con los archivos CSV, y admite la edición de ellos en una vista de tabla y funciona mucho mejor que el complemento vim csv.vim o el complemento atómico tablr.

Captura de pantalla de la vista de tabla

Lo mismo debería aplicarse a sus otros editores, es decir, IntelliJ Idea, Android Studio, Pycharm y RubyMine. No es software libre, pero algunos de sus productos tienen ediciones comunitarias.

(Sin embargo, aún no es perfecto, ya que a veces solo muestra errores de archivo demasiado grandes).

k0pernikus
fuente
0

Sugiero el complemento tablr para el editor Atom.

No es la opción más ligera, pero logra ediciones simples en la menor cantidad de clics.

ingrese la descripción de la imagen aquí

Vanuan
fuente
-1

Guarde su ejemplo como test.csv y lo abrí con LibreOffice sin ningún problema:

$ cat test.csv
This,is,data,with,a,header
2,2,3,4,,
1,,3,,6,6
,5,3,5,5,6
1,2,,,,
1,2,3,4,8,6
1,,9,,5,9
-1,,3,4,5,6
1,2,0,4,5,6
$ libreoffice test.csv 

Luego obtuve este diálogo y elegí "coma" como separador:

ingrese la descripción de la imagen aquí

Hice clic en Aceptar y obtuve esto:

ingrese la descripción de la imagen aquí

¿Qué más necesitas?

terdon
fuente
El problema que tengo con openoffice es que a veces las opciones del separador cambian sin previo aviso, y el archivo se guarda con delimitadores de comillas (OO parece carecer de valores predeterminados de forzado). Sucede más al guardar un archivo de salida en lugar de cargar un archivo en.
Andrew Wood
Sin embargo, es posible con OpenOffice, tienes razón.
Andrew Wood
1
En cuanto a "¿qué más necesitas?", He estado en la situación de @AndrewWood y, en general, necesito menos :) He hecho personalmente esta pregunta antes. Me encanta LibreOffice. Lo uso todo el tiempo. Pero a veces quieres un editor CSV simple que no ocupe una gran cantidad de RAM y simplemente se mantenga fuera de tu camino.
Rich Homolka
@RichHomolka, para decirte la verdad, yo uso gawk:)
terdon
Actuación. Una vez que el csv se vuelve un poco más grande, solo cargarlos lleva una eternidad, y ya ni siquiera intento editar esos archivos dentro de OpenOffice.
k0pernikus