Modifica dei file CSV in Ubuntu [chiuso]


9

Qual è un buon modo per modificare i file CSV in Ubuntu?

I file hanno un aspetto simile al seguente:

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

Sto usando OpenOffice, ma ci vogliono circa 5 clic per disattivare il comportamento predefinito di quotazione di tutti i campi.

Mi piacerebbe trovare qualcosa di leggero e facile da usare che consenta l'inserimento / l'eliminazione di dati e l'ordinamento basato su colonne.

Risposte:


3

Per vim, c'è un bel plugin csv.vim .


Vengo da quel plugin in cerca di un'alternativa. Ha enormi problemi di prestazioni quando i csv sono "più grandi"; attualmente esegue il loop per un CSV con 500 righe.
k0pernikus,


2

A questo scopo potresti usare gnumeric. Sul mio sistema (Crunchbang) e con un file piccolo come nel tuo esempio, leafpad consuma circa 2M di RAM; gnumeric, 4M; e scalc (da LibreOffice), 34M. Gnumeric è chiaramente all'estremità leggera e dovrebbe rilevare correttamente il separatore all'apertura del file.

Ma (c'è un ma ...) gnumeric non ti permetterà di salvare il file modificato senza passare attraverso un ostacolo di menu. Quello che segue è uno script BASH per risolvere questo problema. Lo script si basa su xsel (un leggero gestore di appunti su linea di comando) per incollare nuovamente il contenuto del foglio di calcolo modificato nel file. Se proveniente (non eseguito), questo script ti dà accesso a due funzioni, gn per aprire il file in gnumeric:

gn filename

e gp per incollare nuovamente il contenuto nel file e chiudere gnumeric:

gp

(Personalmente, sorgente questo script nel mio .bashrc per avere le funzioni gn e gp disponibili ogni volta che apro un terminale.)

#! /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."
}

Come lo script stesso ti dirà quando apri il tuo file con gnumeric, quando hai finito con la modifica, devi selezionare la porzione del foglio di calcolo che vuoi salvare prima di premere Ctr-C (per copiare questa porzione negli appunti). Tornando alla riga di comando (Alt-Tab), inserendo gp si aggiorna il file con il contenuto degli Appunti e si chiude gnumeric. I valori modificati non avranno virgolette, ma saranno separati da tabulazioni; quindi, lo script usa sed per sostituire le tab con virgole.

Ho trovato che questo è un modo efficiente per lavorare su file di dati CSV dalla riga di comando. Lo script dovrebbe salvare il file correttamente a condizione che non contenga schede all'interno dei campi separati da virgola (che sembra essere il caso nell'esempio di analisi dei dati).


1

So cosa intendi per {Libre, Open} Office. TBH, non ho mai trovato nulla di veramente buono su Linux che sia anche leggero.

Il "migliore" (sì, tra virgolette ironiche) che ho trovato finora è un'app java chiamata csveditor È abbastanza pulita, ma non segue davvero le migliori linee guida dell'interfaccia utente.



0

Sto usando phpstorm e devo occuparmi molto dei file CSV, e supporta la loro modifica in una vista tabella e funziona molto meglio del plug-in vim csv.vim o del tablr del plug-in atom.

Schermata della vista tabella

Lo stesso dovrebbe valere per gli altri editor, ad esempio IntelliJ Idea, Android Studio, Pycharm e RubyMine. Non è un software gratuito, ma alcuni dei loro prodotti hanno edizioni della community.

(Eppure davanzale non è perfetto in quanto a volte mostra solo errori di file troppo grandi.)


0

Suggerisco il plugin tablr per l'editor Atom.

Non è l'opzione più leggera ma realizza semplici modifiche con il minor numero di clic.

inserisci qui la descrizione dell'immagine


-1

Ho salvato il tuo esempio come test.csv e l'ho aperto con LibreOffice senza alcun 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 

Ho quindi ottenuto questa finestra di dialogo e ho scelto "virgola" come separatore:

inserisci qui la descrizione dell'immagine

Ho cliccato su OK e ho ottenuto questo:

inserisci qui la descrizione dell'immagine

Cosa ti serve ancora?


Il problema che sto riscontrando con openoffice è che a volte le opzioni del separatore cambiano senza preavviso e il file viene salvato con delimitatori di virgolette (OO sembra mancare forzando le impostazioni predefinite). Succede di più quando si salva un file anziché caricarlo.
Andrew Wood,

Certamente è possibile con OpenOffice, hai ragione.
Andrew Wood,

1
Per quanto riguarda "cosa ti serve di più", sono stato nella situazione di @AndrewWood e generalmente ho bisogno di meno :) Ho fatto personalmente questa domanda prima. Adoro LibreOffice. Io lo uso per tutto il tempo. Ma a volte vuoi un semplice editor CSV che non occupi una grande quantità di RAM e rimanga fuori dai piedi.
Rich Homolka,

@RichHomolka, a dire la verità, io uso gawk:)
terdon

Prestazione. Una volta che il CSV è diventato un po 'più grande, il loro caricamento richiede solo un'eternità e non provo nemmeno più a modificare tali file in OpenOffice.
k0pernikus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.