Italiano

Dati e fogli di calcolo · CSV Pulitore

Come un parser CSV gestisce le virgolette, le virgole incorporate e i ritorni a capo nei campi

· Come funziona

csv analisi formati di dati

Un percorso dello stato del parser che mantiene virgolette, virgolette doppie e interruzioni di riga incorporate all'interno dei campi
Illustrazione vettoriale originale ToolAcre

La divisione in virgole funziona finché un campo non contiene una virgola, una virgoletta o un'interruzione di riga. Questo post spiega la piccola macchina a stati utilizzata da un vero parser CSV, perché esistono regole di quotazione e cosa fa uno strumento di riparazione quando la quotazione viene interrotta.

Un campo indirizzo con una virgola ha spostato ogni colonna a destra: perché la suddivisione ingenua non viene analizzata

La divisione di una riga in corrispondenza di ogni virgola non riesce non appena un indirizzo postale, una nota o una descrizione del prodotto contiene quel carattere. Il separatore termina un campo solo mentre il parser è all'esterno di un campo tra virgolette. Tra virgolette, lo stesso byte appartiene al valore e deve raggiungere l'anteprima invariato.

ToolAcre lo dimostra con test anziché presumere che CSV sia testo semplice. Un file punto e virgola contenente virgole all'interno di note tra virgolette viene comunque rilevato come delimitato da punto e virgola perché ciascun candidato viene analizzato in righe prima che venga calcolata la sua forma rettangolare. Il semplice conteggio della punteggiatura non decide mai il dialetto.

Le regole delle virgolette: i campi contenenti il ​​delimitatore, le virgolette o i ritorni a capo sono racchiusi tra virgolette doppie e le virgolette interne sono raddoppiate

Durante la serializzazione viene racchiuso tra virgolette un campo contenente il delimitatore scelto, una virgoletta doppia, un avanzamento riga o un ritorno a capo. Una doppia virgoletta letterale all'interno di un campo tra virgolette è rappresentata da due virgolette adiacenti. Durante l'analisi, quella coppia contribuisce con una virgoletta alla cella e non chiude il campo.

Le virgolette aprono uno stato tra virgolette solo quando appaiono all'inizio di un campo altrimenti vuoto. In un valore senza virgolette come la pipe 12", la virgoletta rimane un dato letterale. Questa scelta di implementazione viene testata e impedisce che un segno di misurazione al centro del testo inghiottisca le colonne successive.

Un parser come macchina a stati: virgolette interne rispetto a virgolette esterne e come un carattere alla volta decide dove finisce un campo

Il ciclo principale tiene traccia di un campo corrente, di una riga corrente e dello stato `inQuotes`. Al di fuori delle virgolette, il delimitatore inserisce un campo e CR, LF o CRLF inserisce una riga. All'interno delle virgolette, ogni carattere viene aggiunto tranne una virgoletta, che forma una coppia di escape o esce dallo stato tra virgolette.

Questa progressione di un carattere spiega perché una semplice espressione regolare o una divisione di riga sono fragili. Se un ritorno a capo termina un record dipende dall'input precedente e se una virgoletta chiude il campo dipende dalla virgoletta successiva. Il parser trasporta esattamente quello stato minimo attraverso la stringa.

Ritorni a capo incorporati: perché una riga può estendersi su più righe e perché strumenti basati su righe come grep o wc contano erroneamente i record

Un campo tra virgolette può contenere LF, CRLF o un solo CR e tali caratteri rimangono all'interno del valore. Di conseguenza in un editor di testo un record logico può occupare più righe di visualizzazione. Il conteggio delle righe fisiche con un comando orientato alla riga non conta necessariamente le righe di dati.

Dopo la virgoletta di chiusura, il successivo delimitatore o fine del record riprende il significato strutturale. I test di ToolAcre asseriscono sia LF incorporato che CRLF incorporato, quindi verificano che sia stata prodotta solo una riga. Questo comportamento non è dedotto da un'etichetta RFC; è esercitato direttamente dalla macchina statale spedita.

Virgolette interrotte: virgolette sbilanciate che inghiottono il resto del file e come uno strumento di riparazione cita nuovamente i campi in modo coerente

Lo schema prometteva una correzione della citazione, ma una citazione non chiusa è intrinsecamente ambigua. ToolAcre riporta `UNCLOSED_QUOTE` rispetto alla riga in cui iniziava lo stato tra virgolette e legge tutto in seguito in un campo. Non inventa una posizione di chiusura né riquota i record previsti.

Questo fallimento conservativo preserva il testo consumato per l'ispezione ed evita di fingere di sapere se una citazione successiva o un ritorno a capo fossero intesi come dati. Correggere l'origine o rigenerare l'esportazione, quindi ricaricare. La serializzazione può normalizzare una tabella analizzata correttamente; non è in grado di recuperare i confini delle righe resi inconoscibili dall'origine dal formato errato.

La quotazione interrotta viene segnalata ma non riparata; un campo non chiuso consuma il testo rimanente

Utilizza `name,note` come intestazione, quindi una riga con Ada e una nota contenente una virgola più un'interruzione di riga e un'altra la cui nota è `She said "hi"`. Nella fonte CSV, cita la nota lunga e scrivi le virgolette interne come `""hi""`. Il parser restituisce due righe di dati e mantiene entrambi i caratteri speciali.

Quando serializzati con virgolette minime, i nomi semplici non necessitano di virgolette, mentre i campi nota sono tra virgolette perché contengono caratteri strutturali. L'analisi dell'output restituisce nuovamente la stessa intestazione e le stesse celle anche se le virgolette di origine ridondanti sono scomparse. L'uguaglianza dei dati, non lo stile byte per byte, definisce questo viaggio di andata e ritorno.

Ciò che questo non copre: i dialetti che utilizzano la barra rovesciata e l'euristica per indovinare l'intento quando si cita è veramente ambiguo

I dialetti di escape con barra rovesciata sono esterni al parser. Una barra rovesciata prima di una virgoletta non ha qui alcun significato speciale per la macchina a stati; rimane testo, mentre la virgoletta viene interpretata secondo le regole delle virgolette doppie. Lo strumento inoltre rifiuta di indovinare l'intento una volta che una citazione di apertura rimane senza corrispondenza.

Questi limiti sono importanti quando si importa un dump del database configurato per un'altra convenzione di escape. Identifica il dialetto del produttore prima del caricamento o esporta con virgolette in stile RFC. Un parser che riconosce silenziosamente diverse regole di escape incompatibili può trasformare le barre rovesciate letterali in una sintassi di controllo e nascondere una mancata corrispondenza.

Rispetta le virgolette e le righe rimangono intatte: in che modo la riparazione delle virgolette di ToolAcre CSV Cleaner produce un file che i parser standard leggono correttamente

Il rispetto dello stato tra virgolette mantiene i delimitatori e le terminazioni dei record all'interno delle celle a cui appartengono. ToolAcre gestisce anche tre moduli di fine riga, rimuove un UTF-8 iniziale BOM e segnala le mancate corrispondenze nella larghezza delle righe. Questi comportamenti sono parti indipendenti di una lettura strutturale piuttosto che una raccolta di trucchi di ricerca e sostituzione.

Dopo un'analisi valida, la serializzazione raddoppia le virgolette incorporate e cita qualsiasi campo che richiede protezione, con l'output CRLF per impostazione predefinita. Dopo una citazione non chiusa non valida, interrompere e riparare dalla prova originale. Lo strumento può standardizzare le celle conosciute; non pretende di ricostruire una tavola inconoscibile.