Dalam file teks, saya ingin menghapus ,
(koma) dan juga "
(tanda kutip) (hanya jika tanda kutip ganda berisi angka yang dipisahkan oleh koma).
56,72,"12,34,54",x,y,"foo,a,b,bar"
Diharapkan ouput
56,72,123454,x,y,"foo,a,b,bar"
Catatan: Saya menunjukkan baris di atas hanya sebagai contoh. File teks saya berisi banyak baris seperti di atas dan angka yang dipisahkan oleh koma yang ada dalam tanda kutip ganda harus bervariasi. Itu adalah,
56,72,"12,34,54",x,y,"foo,a,b,bar"
56,92,"12,34",x,y,"foo,a,b,bar"
56,72,"12,34,54,78,76,54,67",x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar","12,34,54"
56,72,x,y,"foo,a,b,bar","12,34,54","45,57,84,92","bar,foo"
Output yang diharapkan:
56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"
Ada n
sejumlah angka yang ada dalam tanda kutip ganda yang dipisahkan oleh koma. Dan juga meninggalkan tanda kutip ganda yang berisi karakter apa adanya.
Saya suka sed
alat pengolah teks. Saya senang jika Anda memposting sed
solusi apa pun untuk ini.
text-processing
sed
csv
Avinash Raj
sumber
sumber
56,72,"12,34,54",x,y,"foo,a,b,bar"
ke56,72,123454,x,y,"a,b"
,foo
danbar
menghilang. Apakah itu output yang Anda inginkan?foo
danbar
) dihapus bersama dengan koma. Selain itu, beberapa kutipan menghilang di tempat yang lainnya. Belum lagi koma antaraa
danb
tetap juga. Apakah ada pola untuk ini?Jawaban:
Ini (diadaptasi dari sini ) harus melakukan apa yang Anda butuhkan meskipun @Rici's Perl satu jauh lebih sederhana:
Penjelasan
:a
: tentukan label yang disebuta
.s/(("[0-9,]*",?)*"[0-9,]*),/\1/
: Yang ini perlu dipecah(foo(bar))
,\1
akanfoobar
dan\2
akanbar
."[0-9,]*",?
: cocok dengan 0 atau lebih dari0-9
atau,
, diikuti oleh 0 atau 1,
.("[0-9,]*",?)*
: cocokkan 0 atau lebih dari yang di atas."[0-9,]*
: cocok dengan 0 atau lebih0-9
atau,
yang datang tepat setelah a"
ta;
: kembali ke labela
dan jalankan lagi jika substitusi berhasil.s/""/","/g;
: pengolahan pasca. Ganti""
dengan","
.s/"([0-9]*)",?/\1,/g
: hapus semua tanda kutip di sekitar angka.Ini mungkin lebih mudah dipahami dengan contoh lain:
Jadi, sementara Anda dapat menemukan nomor yang tepat setelah penawaran dan diikuti oleh koma dan nomor lain, gabungkan kedua angka tersebut bersama-sama dan ulangi prosesnya hingga tidak mungkin lagi.
Pada titik ini saya percaya akan berguna untuk menyebutkan kutipan dari
info sed
yang muncul di bagian yang menjelaskan fungsi-fungsi lanjutan seperti label yang digunakan di atas (terima kasih telah menemukan jika @Braiam):sumber
Jika perl OK, berikut ini cara yang singkat (dan mungkin cepat, jika tidak selalu sederhana :)):
The
e
bendera kes:::
operator (yang hanya cara lain untuk menuliss///
) menyebabkan pengganti yang akan diperlakukan sebagai ekspresi yang dievaluasi setiap kali. Ekspresi yang mengambil$1
tangkapan dari regex (yang sudah hilang tanda kutip) dan menerjemahkan (y///
, yang juga dapat ditulis sebagaitr///
) dengan menghapus (/d
) semua koma. Ther
bendera untuky
ini diperlukan dalam rangka untuk mendapatkan nilai menjadi string diterjemahkan, bukan hitungan terjemahan.Bagi mereka yang entah bagaimana merasa dinodai oleh perl, di sini adalah setara python. Python sebenarnya bukan alat shell satu-liner, tetapi kadang-kadang dapat dibujuk untuk bekerja sama. Berikut ini dapat ditulis sebagai satu baris (tidak seperti
for
loop, yang tidak bisa), tetapi pengguliran horizontal membuatnya (bahkan lebih) tidak dapat dibaca:sumber
y///
alih-alihtr///
selamatkan kami satu karakter lagi.Untuk data CSV, saya akan menggunakan bahasa dengan parser CSV nyata. Misalnya dengan Ruby:
sumber
Hai Di sini adalah kode Python untuk Mengganti koma dengan tanda kutip ganda, koma diganti dengan karakter pipa (|)
Kode Python ini untuk menggantikan koma yang dilampirkan dalam tanda kutip ganda
misal: x, y, z, 1,2, "r, e, t, y", h, 8,5,6
jika ganti dengan Pipa x, y, z, 1,2, "r | e | t | y", h, 8,5,6
jika ganti dengan nol x, y, z, 1,2, "rety", h, 8,5,6
sumber