Edycja plików CSV w Ubuntu [zamknięte]


9

Jaki jest dobry sposób edycji plików CSV w Ubuntu?

Pliki wyglądają mniej więcej tak:

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

Korzystam z OpenOffice, ale potrzeba około 5 kliknięć, aby wyłączyć domyślne zachowanie cytowania wszystkich pól.

Chciałbym znaleźć coś lekkiego i łatwego w użyciu, który umożliwi wstawianie / usuwanie danych oraz sortowanie według kolumn.

Odpowiedzi:


3

Dla vima jest ładna wtyczka csv.vim .


Właśnie pochodzę z tej wtyczki, szukając alternatywy. Ma ogromny problem z wydajnością, gdy pliki csv są „większe”; obecnie zapętla dla pliku csv mającego 500 linii.
k0pernikus


2

W tym celu możesz użyć gnumeric. W moim systemie (Crunchbang) i przy tak małym pliku jak w twoim przykładzie leafpad zużywa około 2M pamięci RAM; gnumeryczny, 4M; i skalc (z LibreOffice), 34 mln. Gnumeric wyraźnie znajduje się na lekkim końcu i powinien poprawnie wykryć separator podczas otwierania pliku.

Ale (istnieje ...) gnumeric nie pozwoli ci zapisać zmodyfikowanego pliku bez przechodzenia przez przeszkodę w menu. Poniżej znajduje się skrypt BASH, aby to naprawić. Skrypt polega na Xsel (lekkim menedżerze schowka linii poleceń) w celu wklejenia zmodyfikowanej zawartości arkusza kalkulacyjnego z powrotem do pliku. Jeśli źródło (nie jest uruchamiane), ten skrypt daje dostęp do dwóch funkcji, gn, aby otworzyć plik gnumeric:

gn filename

i gp, aby wkleić zawartość z powrotem do pliku i zamknąć gnumeric:

gp

(Osobiście ten skrypt źródłowy umieszczam w moim .bashrc, aby mieć dostęp do funkcji gn i gp przy każdym otwarciu terminala).

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

Jak sam skrypt powie ci podczas otwierania pliku za pomocą gnumeric, kiedy skończysz edycję, musisz wybrać część arkusza kalkulacyjnego, którą chcesz zapisać przed naciśnięciem Ctr-C (aby skopiować tę część do schowka). Wracając do wiersza poleceń (Alt-Tab), wpisanie gp zaktualizuje plik o zawartość schowka i zamknie gnumeric. Zmodyfikowane wartości nie będą zawierać cudzysłowów, ale będą oddzielone tabulatorami; stąd skrypt używa sed do zamiany tabulatorów na przecinki.

Przekonałem się, że jest to skuteczny sposób pracy na plikach danych CSV z wiersza poleceń. Skrypt powinien poprawnie zapisywać plik, o ile nie zawiera tabulatorów w polach oddzielonych przecinkami (co wydaje się mieć miejsce w przykładzie analizy danych).


1

Wiem, co masz na myśli o {Libre, Open} Office. TBH, nigdy nie znalazłem nic dobrego na Linuksie, co byłoby również lekkie.

„Najlepsze” (tak, w ironicznych cytatach), które do tej pory znalazłem, to aplikacja Java o nazwie csveditor. Jest dość czysta, ale tak naprawdę nie jest zgodna z najlepszymi wytycznymi interfejsu użytkownika.



0

Używam phpstorm i muszę dużo radzić sobie z plikami CSV, obsługuje edycję ich w widoku tabeli i działa znacznie lepiej niż wtyczka vim csv.vim lub tablr wtyczki atomowej.

Zrzut ekranu widoku tabeli

To samo powinno dotyczyć ich innych edytorów, tj. IntelliJ Idea, Android Studio, Pycharm i RubyMine. To nie jest wolne oprogramowanie, ale niektóre z ich produktów mają wersje społecznościowe.

(Jednak parapet nie jest idealny, ponieważ czasami pokazuje po prostu zbyt duże błędy pliku).



-1

Zapisałem twój przykład jako test.csv i bez problemu otworzyłem go w LibreOffice:

$ 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 

Następnie dostałem to okno dialogowe i jako separator wybrałem „przecinek”:

wprowadź opis zdjęcia tutaj

Kliknąłem OK i otrzymałem:

wprowadź opis zdjęcia tutaj

Czego więcej potrzebujesz?


Problem, który mam z openoffice, polega na tym, że czasami opcje separatora zmieniają się bez powiadomienia, a plik jest zapisywany z ogranicznikami cudzysłowu (OO wydaje się nie wymuszać domyślnych). Zdarza się to częściej podczas zapisywania pliku niż ładowania pliku.
Andrew Wood

Z pewnością jest to możliwe dzięki OpenOffice, masz rację.
Andrew Wood

1
Jeśli chodzi o „czego więcej potrzebujesz”, byłem w sytuacji @AndrewWood i generalnie potrzebuję mniej :) Osobiście zadałem to pytanie wcześniej. Kocham LibreOffice. Używam tego cały czas. Ale czasami potrzebujesz prostego edytora CSV, który nie zajmuje ogromnej ilości pamięci RAM i po prostu nie przeszkadza.
Rich Homolka

@RichHomolka, prawdę mówiąc, używam gawk:)
terdon

Wydajność. Gdy plik csv stanie się nieco większy, samo ładowanie trwa wieczność, a ja nawet nie próbuję już edytować takich plików w OpenOffice.
k0pernikus
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.