Saya memiliki sejumlah file CSV besar dan menginginkannya dalam TSV (format tab terpisah). Masalahnya adalah ada koma di bidang file CSV, misalnya:
A,,C,"D,E,F","G",I,"K,L,M",Z
Output yang diharapkan:
A C D,E,F G I K,L,M Z
(di mana spasi putih di antaranya adalah tab 'sulit')
Saya memiliki Perl, Python, dan coreutils yang diinstal pada server ini.
text-processing
python
perl
csv-simple
Hati gelap
sumber
sumber
Jawaban:
Python
Tambahkan ke file bernama
csv2tab.sh
, dan buat itu bisa dieksekusiTes berjalan
sumber
csv.writer(sys.stdout, dialect='excel-tab').writerows(csv.reader(sys.stdin))
? Menghilangkan loop juga.python -c 'import csv,sys; csv.writer(sys.stdout, dialect="excel-tab").writerows(csv.reader(sys.stdin))'
. Saya ragu-m
bekerja seperti itu.Untuk bersenang-senang
sed
,.Jika Anda
sed
tidak mendukung-E
, coba dengan-r
. Jika Andased
tidak mendukung\t
tab literal, coba letakkan tab literal (dalam banyak shell, ctrl- v tab) atau di Bash, gunakan$'...'
string gaya-C (dalam hal ini backslash in\2
perlu digandakan). Jika Anda ingin menyimpan tanda kutip, gunakan\1
sebagai ganti\2
(dalam hal ini pasangan dalam tanda kurung tidak berguna, dan dapat dihapus).Ini tidak berusaha untuk menangani tanda kutip ganda yang lolos dalam tanda kutip ganda; beberapa dialek CSV mendukung ini dengan menggandakan penawaran ganda yang dikutip.
sumber
Menggunakan
csvkit
utilitas (Python), misalnya:Apakah streaming, dengan CSV dan TSV yang benar mengutip dan melarikan diri
Ada di manajer paket apt dan lainnya
sumber
Satu pilihan mungkin teks Perl :: modul CSV misalnya
untuk menunjukkan
sumber
Perl
Awk
Hasil:
sumber
Solusi penerbang lalat termonuklir harus menggunakan libreoffice. Sementara https://ask.libreoffice.org/en/question/19042/is-is-possible-to-convert-comma-separated-value-csv-to-tab-separated-value-tsv-via-headless-mode Saya menyarankan ini tidak mungkin tetapi itu salah (atau hanya kedaluwarsa?) dan perintah berikut ini berfungsi pada 5.3 saya.
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
yang
env
argumen bisa dilewati tetapi cara ini dokumen tidak akan muncul dalam dokumen terbaru Anda.sumber
Jika Anda memiliki, atau dapat menginstal,
csvtool
utilitas:Perhatikan bahwa karena alasan tertentu
csvtool
tidak memiliki halaman manual, tetapicsvtool --help
akan mencetak beberapa ratus baris dokumentasi.sumber
Menggunakannya
mlr
hampir ringkas, tetapi menonaktifkan tajuk membutuhkan opsi panjang:Keluaran:
sumber
Saya membuat CSV ke TSV sumber terbuka converter yang menangani transformasi yang dijelaskan. Ini cukup cepat, mungkin patut dilihat jika ada kebutuhan yang sedang berlangsung untuk mengkonversi file CSV besar. Tool adalah bagian dari toolkit utilitas TSV eBay (dokumentasi csv2tsv di sini ). Opsi default cukup untuk input yang dijelaskan:
sumber
Vim
Hanya untuk bersenang-senang, penggantian regex dapat dilakukan di Vim . Berikut ini adalah solusi empat jalur potensial, yang diadaptasi dari: /programming/33332871/remove-all-commas-between-quotes-with-a-vim-regex
Tanda kutip dihapus.
Untuk skrip solusinya agak, empat baris di atas (sans leading colon) dapat disimpan ke file, misalnya
to_tsv.vim
. Buka setiap CSV untuk mengedit dengan Vim dansource
yangto_tsv.vim
script pada Vim baris perintah (diadaptasi dari /programming/3374179/run-vim-script-from-vim-commandline/8806874#8806874 ):sumber
Berikut adalah contoh konversi CSV ke TSV menggunakan
jq
utilitas :atau:
Namun format CSV perlu diformat dengan baik, sehingga setiap string perlu dikutip.
Sumber: Format output TSV sederhana .
sumber
Dengan
perl
, anggap bidang csv tidak memiliki"
baris atau tab yang disematkan atau baru:sumber
Berikut ini hanyalah koreksi terhadap jawaban dari @tripleee sehingga menghilangkan tanda kutip dari bidang terakhir sama halnya dengan semua bidang lainnya.
Untuk menunjukkan apa yang sedang diperbaiki, di bawah ini adalah jawaban tripleee , ditambah sedikit modifikasi pada contoh data OP dengan kutipan tambahan di sekitar bidang ' Z ' akhir .
Anda dapat melihat bahwa ' Z ' dibiarkan dengan tanda kutip di sekitarnya. Ini berbeda dengan bagaimana bidang dalam ditangani. Misalnya, ' G ' tidak memiliki tanda kutip di atasnya.
Perintah berikut menggunakan subtitusi kedua untuk membersihkan kolom terakhir:
sumber
'A,,C,"D,E,F","G",I,"K,L,M","Z,A"'
input dimasukkan ke jawaban ini, maka"Z,A"
diganti dengan salahZ A
, bukan yang benarZ,A
.