Modification de fichiers CSV dans Ubuntu [fermé]


9

Quelle est la bonne façon de modifier des fichiers CSV dans Ubuntu?

Les fichiers ressemblent à ceci:

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

J'utilise OpenOffice, mais il faut environ 5 clics pour désactiver le comportement par défaut de la citation de tous les champs.

J'aimerais trouver quelque chose de léger et facile à utiliser qui permettra d'insérer / supprimer des données et un tri basé sur les colonnes.

Réponses:


3

Pour vim, il y a un joli plugin csv.vim .


Je viens de ce plugin à la recherche d'une alternative. Il a un énorme problème de performances lorsque les csv sont "plus grands"; actuellement, il boucle pour un csv ayant 500 lignes.
k0pernikus


2

Vous pouvez utiliser gnumeric à cette fin. Sur mon système (Crunchbang) et avec un fichier aussi petit que dans votre exemple, leafpad consomme environ 2M de RAM; gnumérique, 4M; et scalc (de LibreOffice), 34M. Gnumeric est clairement du côté léger, et il devrait détecter correctement votre séparateur à l'ouverture du fichier.

Mais (il y a un mais ...) gnumeric ne vous permettra pas d'enregistrer le fichier modifié sans passer par un obstacle de menus. Ce qui suit est un script BASH pour résoudre ce problème. Le script s'appuie sur xsel (un gestionnaire de presse-papiers de ligne de commande léger) pour coller à nouveau le contenu de la feuille de calcul modifiée dans votre fichier. S'il est sourced (non exécuté), ce script vous donne accès à deux fonctions, gn pour ouvrir le fichier en gnumeric:

gn filename

et gp pour coller le contenu dans le fichier et fermer gnumeric:

gp

(Personnellement, je source ce script dans mon .bashrc pour avoir les fonctions gn et gp disponibles chaque fois que j'ouvre 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."
}

Comme le script lui-même vous le dira lors de l'ouverture de votre fichier avec gnumeric, lorsque vous avez terminé votre édition, vous devez sélectionner la partie de la feuille de calcul que vous souhaitez enregistrer avant d'appuyer sur Ctr-C (pour copier cette partie dans le presse-papiers). Pour revenir à la ligne de commande (Alt-Tab), entrer gp mettra à jour votre fichier avec le contenu du presse-papiers et fermera gnumeric. Vos valeurs modifiées ne seront pas entourées de guillemets, mais elles seront séparées par des tabulations; par conséquent, le script utilise sed pour remplacer les tabulations par des virgules.

J'ai trouvé que c'était un moyen efficace de travailler sur des fichiers de données CSV à partir de la ligne de commande. Le script doit enregistrer le fichier correctement tant qu'il ne contient pas d'onglets dans les champs séparés par des virgules (ce qui semble être le cas dans votre exemple d'analyse de données).


1

Je sais ce que vous voulez dire à propos de {Libre, Open} Office. TBH, je n'ai jamais rien trouvé de vraiment bon sur Linux qui soit aussi léger.

Le "meilleur" (oui, entre guillemets ironiques) que j'ai trouvé jusqu'à présent est une application java appelée csveditor C'est assez propre, mais ne suit pas vraiment les meilleures directives de l'interface utilisateur.



0

J'utilise phpstorm et je dois beaucoup gérer les fichiers CSV, et il prend en charge leur édition dans une vue de table et il fonctionne beaucoup mieux que le plugin vim csv.vim ou le plugin atom tablr.

Capture d'écran de la vue tableau

La même chose devrait s'appliquer à leurs autres éditeurs, à savoir IntelliJ Idea, Android Studio, Pycharm et RubyMine. Ce n'est pas un logiciel libre, mais certains de leurs produits ont des éditions communautaires.

(Pourtant, il n'est pas parfait car il montre parfois des erreurs de fichier trop importantes.)


0

Je suggère un plugin tablr pour l'éditeur Atom.

Ce n'est pas l'option la plus légère, mais permet des modifications simples en quelques clics.

entrez la description de l'image ici


-1

J'ai enregistré votre exemple sous test.csv et l'ai ouvert avec LibreOffice sans aucun problème:

$ 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 

J'ai ensuite obtenu cette boîte de dialogue et j'ai choisi "virgule" comme séparateur:

entrez la description de l'image ici

J'ai cliqué sur OK et j'ai obtenu ceci:

entrez la description de l'image ici

De quoi d'autre avez-vous besoin?


Le problème que j'ai avec openoffice est que parfois les options de séparateur changent sans préavis, et le fichier est enregistré avec des délimiteurs de devis (OO semble manquer de forcer les valeurs par défaut). Cela se produit davantage lors de l'enregistrement d'un fichier plutôt que du chargement d'un fichier.
Andrew Wood

C'est certainement possible avec OpenOffice, vous avez raison.
Andrew Wood

1
En ce qui concerne "de quoi avez-vous besoin de plus", j'ai été dans la situation de @AndrewWood et j'ai généralement besoin de moins :) J'ai personnellement posé cette question auparavant. J'adore LibreOffice. Je l'utilise tout le temps. Mais parfois, vous voulez un simple éditeur CSV qui n'occupe pas une énorme partie de RAM et reste simplement à l'écart.
Rich Homolka

@RichHomolka, pour vous dire la vérité, j'utilise gawk:)
terdon

Performance. Une fois que le fichier csv est un peu plus volumineux, il suffit de le charger pour toujours, et je n'essaie même plus de modifier de tels fichiers dans OpenOffice.
k0pernikus
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.