Data & spreadsheet · CSV Lebih bersih
Bagaimana Parser CSV Menangani Kutipan, Koma Tersemat, dan Baris Baru di Bidang
· Cara kerjanya
csv penguraian format data
Pemisahan koma berfungsi hingga bidang berisi koma, kutipan, atau jeda baris. Posting ini menjelaskan mesin status kecil yang digunakan oleh parser CSV, mengapa ada aturan penawaran, dan apa yang dilakukan alat perbaikan ketika penawaran rusak.
Bidang alamat dengan koma menggeser setiap kolom ke kanan — mengapa pemisahan naif tidak dilakukan penguraian
Pemisahan baris di setiap koma gagal segera setelah alamat pos, catatan, atau deskripsi produk berisi karakter tersebut. Pemisah hanya mengakhiri suatu bidang sementara parser berada di luar bidang yang dikutip. Di dalam tanda kutip, byte yang sama termasuk dalam nilai dan harus mencapai pratinjau tanpa perubahan.
ToolAcre membuktikannya dengan tes daripada berasumsi CSV adalah teks sederhana. File titik koma yang berisi koma di dalam catatan yang dikutip masih terdeteksi sebagai dipisahkan titik koma karena setiap kandidat diurai menjadi beberapa baris sebelum bentuk persegi panjangnya diberi skor. Jumlah tanda baca mentah tidak pernah menentukan dialek.
Aturan kutipan — bidang yang berisi pembatas, tanda kutip, atau baris baru diapit dengan tanda kutip ganda, dan tanda kutip dalam digandakan
Bidang yang berisi pembatas yang dipilih, kutipan ganda, umpan baris, atau pengangkutan kembali dikutip selama serialisasi. Kutipan ganda literal di dalam kolom yang dikutip diwakili oleh dua tanda kutip yang berdekatan. Saat parse, pasangan tersebut menyumbangkan satu kutipan ke sel dan tidak menutup bidang.
Kutipan hanya membuka status kutipan ketika muncul di awal bidang yang kosong. Dalam nilai yang tidak diberi tanda kutip seperti pipa 12", kutipan tetap merupakan data literal. Pilihan implementasi tersebut diuji dan mencegah tanda pengukuran di tengah teks menelan kolom berikutnya.
Parser sebagai mesin negara — tanda kutip dalam versus tanda kutip luar, dan bagaimana satu karakter pada suatu waktu memutuskan di mana suatu bidang berakhir
Loop inti melacak bidang saat ini, baris saat ini, dan status `inQuotes`. Di luar tanda kutip, pembatas mendorong sebuah bidang dan CR, LF atau CRLF mendorong sebuah baris. Di dalam tanda kutip, setiap karakter ditambahkan kecuali tanda kutip, yang akan membentuk pasangan escape atau keluar dari status tanda kutip.
Perkembangan satu karakter ini menjelaskan mengapa ekspresi reguler sederhana atau pemisahan garis itu rapuh. Apakah baris baru mengakhiri rekaman bergantung pada masukan sebelumnya, dan apakah kutipan menutup bidang bergantung pada kutipan berikutnya. Parser membawa keadaan minimal tersebut melalui string.
Baris baru yang tersemat — mengapa sebuah baris dapat menjangkau beberapa baris dan mengapa alat berbasis baris seperti catatan salah hitung grep atau wc
Bidang yang dikutip mungkin berisi LF, CRLF, atau CR tunggal, dan karakter tersebut tetap berada di dalam nilainya. Akibatnya satu catatan logis dapat menempati beberapa baris tampilan dalam editor teks. Menghitung baris fisik dengan perintah berorientasi baris tidak serta merta menghitung baris data.
Setelah kutipan penutup, pembatas atau akhir rekaman berikutnya melanjutkan makna struktural. Pengujian ToolAcre menegaskan LF yang tersemat dan CRLF yang tersemat, lalu memverifikasi bahwa hanya satu baris yang dihasilkan. Perilaku ini tidak disimpulkan dari label RFC; itu dilakukan langsung oleh mesin negara yang dikirim.
Kutipan rusak — kutipan tidak seimbang yang menelan sisa file, dan bagaimana alat perbaikan mengutip ulang kolom secara konsisten
Garis besarnya menjanjikan perbaikan kutipan, tetapi kutipan yang tidak ditutup pada dasarnya bersifat ambigu. ToolAcre melaporkan `UNCLOSED_QUOTE` terhadap baris tempat status yang dikutip dimulai dan membaca semuanya setelahnya ke dalam satu bidang. Itu tidak menciptakan posisi penutupan atau mengutip ulang catatan yang dimaksudkan.
Kegagalan konservatif tersebut mempertahankan teks yang digunakan untuk diperiksa dan menghindari berpura-pura mengetahui apakah kutipan atau baris baru berikutnya dimaksudkan sebagai data. Perbaiki sumbernya atau buat ulang ekspornya, lalu muat ulang. Serialisasi dapat menormalkan tabel yang berhasil diurai; ia tidak dapat memulihkan batas baris yang formatnya salah sehingga tidak dapat diketahui.
Kutipan yang rusak dilaporkan tetapi tidak diperbaiki; bidang yang tidak ditutup menggunakan teks yang tersisa
Gunakan `name,note` sebagai header, lalu satu baris dengan Ada dan catatan berisi koma ditambah jeda baris, dan baris lainnya dengan catatan `She said "hi"`. Pada sumber CSV, kutip catatan panjang dan tulis tanda kutip bagian dalam sebagai `""hi""`. Parser mengembalikan dua baris data dan mempertahankan kedua karakter khusus.
Jika diserialkan dengan kutipan minimal, nama biasa tidak perlu tanda kutip, sedangkan kolom catatan diberi tanda kutip karena mengandung karakter struktural. Mengurai keluaran itu lagi akan menghasilkan header dan sel yang sama meskipun kutipan sumber yang berlebihan hilang. Kesetaraan data, bukan gaya byte demi byte, yang menentukan perjalanan bolak-balik ini.
Apa yang tidak tercakup di sini - dialek yang menggunakan pelolosan garis miring terbalik, dan heuristik untuk menebak maksud saat mengutip benar-benar ambigu
Dialek escape backslash berada di luar parser. Garis miring terbalik sebelum kutipan tidak memiliki arti mesin negara khusus di sini; itu tetap berupa teks, sedangkan kutipannya ditafsirkan berdasarkan aturan kutipan ganda. Alat ini juga menolak menebak maksud setelah kutipan pembukaan tetap tidak cocok.
Batasan tersebut penting saat mengimpor dump database yang dikonfigurasi untuk konvensi escape lainnya. Identifikasi dialek produsen sebelum memuat, atau ekspor dengan kutipan gaya RFC. Parser yang secara diam-diam mengenali beberapa aturan escape yang tidak kompatibel dapat mengubah garis miring terbalik menjadi sintaks kontrol dan menyembunyikan ketidakcocokan.
Hormati tanda kutip dan baris tetap utuh — bagaimana perbaikan kutipan ToolAcre CSV Cleaner menghasilkan file yang dapat dibaca dengan benar oleh parser standar
Menghormati negara yang dikutip menyimpan pembatas dan mencatat akhiran di dalam sel tempatnya berada. ToolAcre juga menangani tiga formulir akhir baris, menghapus UTF-8 BOM di depannya dan melaporkan ketidakcocokan lebar baris. Perilaku ini merupakan bagian independen dari satu pembacaan struktural dan bukan kumpulan trik cari dan ganti.
Setelah penguraian yang valid, serialisasi menggandakan tanda kutip yang disematkan dan mengutip bidang apa pun yang memerlukan perlindungan, dengan keluaran CRLF secara default. Setelah kutipan tidak tertutup yang tidak valid, hentikan dan perbaiki dari bukti sumber. Alat ini dapat membakukan sel yang diketahui; ia tidak mengklaim merekonstruksi tabel yang tidak dapat diketahui.