Mam wiele dużych plików CSV i chciałbym je w formacie TSV (format rozdzielany tabulatorami). Problem polega na tym, że w polach pliku CSV znajdują się przecinki, np .:
A,,C,"D,E,F","G",I,"K,L,M",Z
Oczekiwany wynik:
A C D,E,F G I K,L,M Z
(gdzie białe spacje to „twarde” karty)
Mam Perla, Pythona i coreutils zainstalowane na tym serwerze.
text-processing
python
perl
csv-simple
Ciemne serce
źródło
źródło
Odpowiedzi:
Pyton
Dodaj do pliku o nazwie
csv2tab.sh
i uczyń go wykonywalnymPrzebiegi testowe
źródło
csv.writer(sys.stdout, dialect='excel-tab').writerows(csv.reader(sys.stdin))
? Eliminuje również pętlę.python -c 'import csv,sys; csv.writer(sys.stdout, dialect="excel-tab").writerows(csv.reader(sys.stdin))'
. Wątpię-m
, żeby tak działało.Dla zabawy
sed
.Jeśli
sed
nie obsługuje-E
, spróbuj-r
. Jeślised
nie obsługujesz\t
literalnej tabulacji, spróbuj umieścić literalną tabulację (w wielu powłokach, ctrl- v tab) lub w Bash, użyj ciągu w$'...'
stylu C (w takim przypadku odwrotny ukośnik w\2
musi zostać podwojony). Jeśli chcesz zachować cudzysłowy, użyj\1
zamiast\2
(w takim przypadku wewnętrzna para nawiasów jest bezużyteczna i może zostać usunięta).Nie czyni to próby obsługi podwójnych cudzysłowów w cudzysłowie; niektóre dialekty CSV obsługują to, podwajając cytowany podwójny cytat (sic).
źródło
Za pomocą
csvkit
narzędzia (Python), na przykład:Czy streaming, z poprawnym cytowaniem CSV i TSV i ucieczką
Jest w apt i innych menedżerach pakietów
źródło
Jedną z opcji może być moduł Text :: CSV perla np
demonstrować
źródło
Perl
Awk
Wynik:
źródło
W termojądrowym roztworze flyswatter musi być używany libreoffice. Podczas gdy https://ask.libreoffice.org/en/question/19042/is-is-possible-to-convert-comma-separated-value-csv-to-tab-separated-value-tsv-via-headless-mode / sugeruje, że nie jest to możliwe, ale jest złe (lub po prostu nieaktualne?), a następujące polecenie działa na moim 5.3 .:
loffice "-env:UserInstallation=file:///tmp/LibO_Conversion" --convert-to csv:"Text - txt - csv (StarCalc)":9,34,UTF8 --headless --outdir some/path --infilter='csv:44,34,UTF8' *.csv
env
argumentem może być pominięte, ale w ten sposób dokumenty nie pojawi się w ostatnim dokumencie.źródło
Jeśli masz lub możesz zainstalować
csvtool
narzędzie:Zauważ, że z jakiegoś powodu
csvtool
nie ma strony podręcznika, alecsvtool --help
wydrukuje kilkaset wierszy dokumentacji.źródło
Korzystanie
mlr
jest prawie zwięzłe, ale wyłączenie nagłówków wymaga długich opcji:Wydajność:
źródło
Jestem autorem konwertera CSV na TSV typu open source, który obsługuje opisane transformacje. Jest dość szybki, może warto go sprawdzić, jeśli istnieje potrzeba konwertowania dużych plików CSV. Narzędzie jest częścią eBay's TSV Utilities Toolkit (dokumentacja csv2tsv tutaj ). Wystarczą domyślne opcje dla opisanych danych wejściowych:
źródło
Wigor
Dla zabawy w Vimie można wykonywać zamiany wyrażeń regularnych . Oto potencjalne czteroliniowe rozwiązanie, zaadaptowane z: /programming/33332871/remove-all-commas-between-quotes-with-a-vim-regex
Znaki cudzysłowu są usuwane.
Aby nieco skrypty rozwiązania, cztery wiersze powyżej (bez dwukropka) można zapisać do pliku, np
to_tsv.vim
. Otwórz każdy plik CSV do edycji z Vima isource
doto_tsv.vim
skryptu na Vima linii poleceń (dostosowany od /programming/3374179/run-vim-script-from-vim-commandline/8806874#8806874 ):źródło
Oto przykład konwersji CSV na TSV za pomocą
jq
narzędzia :lub:
Jednak format CSV musi być dobrze sformatowany, więc każdy ciąg musi być cytowany.
Źródło: prosty format wyjściowy TSV .
źródło
Przy
perl
założeniu, że pola csv nie mają osadzonych"
ani nowych linii lub kart:źródło
Poniżej znajduje się po prostu korekta odpowiedzi @tripleee, dzięki czemu usuwa cudzysłowy z ostatniego pola, tak jak w przypadku wszystkich innych pól.
Aby pokazać, co jest poprawiane, poniżej znajduje się odpowiedź trójki oraz niewielka modyfikacja przykładowych danych OP z dodanymi cudzysłowami wokół końcowego pola „ Z ”.
Widać, że „ Z ” zostało otoczone cudzysłowami. Różni się to od obsługi pól wewnętrznych. Na przykład „ G ” nie zawiera cudzysłowów.
Następujące polecenie używa drugiego podstawienia do wyczyszczenia ostatniej kolumny:
źródło
'A,,C,"D,E,F","G",I,"K,L,M","Z,A"'
są wprowadzane do tej odpowiedzi, wówczas"Z,A"
jest ona niepoprawnie zastępowana przezZ A
, a nie poprawnaZ,A
.