Home > Listati di programmi C > Programmi per importare dati da file csv a file di struct C

PROGRAMMI PER IMPORTARE DATI DA FILE CSV A FILE DI STRUCT C

Un file CSV e' un file di puro testo in cui sono stati inseriti dei dati prelevati da una tabella (database o foglio di calcolo); di solito questi dati sono stringhe di testo, ma possono esserci anche tipi numerici.

In un file CSV ad ogni record corrisponde una riga e, all'interno della stessa riga, ogni campo (tranne l'ultimo) e' seguito da un apposito carattere che segnala la fine del campo; l'ultimo campo e' seguito dal byte di fine riga (di solito 10 per i file creati in ambiente unix/linux).

Il separatore di campo puo' essere la virgola (ASCII 44), il punto e virgola (59) o altro; la scelta del separatore e' affidata al programma o all'utente che ha creato il file CSV.

La prima riga puo' contenere l'elenco dei nomi dei campi; ma questo non avviene sempre; se la prima riga non contiene i nomi dei campi (ma contiene dati), prima di usare i miei programmi bisogna inserire manualmente la riga coi nomi di campo, usando un editor che gestisca file di puro testo (edit, vi e simili).

Ecco un esempio di dati in formato CSV (il separatore di campo e' la virgola):

Autore,Titolo,Genere
Giulio Cesare,La guerra gallica,Storia
Jeoff Dromey,Algoritmi fondamentali,Informatica
Jules Verne,La casa a vapore,Avventure

In certi casi, il carattere usato come separatore di campo puo' anche trovarsi all'interno di un dato; bisogna percio' dare al programma che scansiona il file la possibilita' di distinguere quando il carattere funge da separatore e quando invece fa parte dei dati.

Nella prassi e' stato ideato questo artifizio: il campo contenente il carattere separatore (ma che non svolge la funzione di separatore) viene delimitato all'inizio e alla fine dal doppio apice " (cod. ASCII 34); questa delimitazione puo' essere fatta sia per un singolo campo, sia per tutti campi (anche per quelli che non contengono il separatore-dato).

Ad esempio, se un file CSV contiene la tavola degli elementi ed il separatore di campo e' la virgola, la prima riga del file potra' essere questa:

Nome elemento,Numero atomico,Peso atomico

e una riga di dati potra' avere questa forma:

Silicio,14,"28,086"

oppure si potra' avere:

"Nome elemento","Numero atomico","Peso atomico"
...............................................
"Silicio","14","28,086"

A questo punto sorge un altro problema: cosa fare se all'interno di un campo compare il doppio apice (che non svolge la funzione di delimitatore, ma che fa parte dei dati)?; la soluzione consiste nel raddoppiare il doppio apice: "".

Il campo Giulio Cesare disse "il dado e' tratto" verrebbe cosi' rappresentato con "Giulio Cesare disse ""il dado e' tratto""". Il programma leggi_csv.c gestisce questi casi.

leggi_csv.c riceve in input il nome di un file CSV e lo legge; l'utente deve anche indicare il separatore di campo e il byte di fine riga; il programma rende in uscita il nome e il numero dei campi, la dimensione massima raggiunta da ogni campo e il numero di righe; individua e conta anche certe anomalie: righe con numero di separatori diverso da quello della prima riga (che contiene l'elenco dei campi) e righe con un numero dispari di doppi apici.

Prima di usare leggi_csv.c, per vedere come e' strutturato il file CSV e quali sono i separatori di campo e i byte di fine stringa, si puo' usare il programma mostra_file.c.

Con il programma crea_ind.c (= crea indice) si puo' creare un file di struct contenente i dati fondamentali di ogni riga di un file CSV dato: posizione nel file, numero di caratteri della riga, numero di separatori di campo con funzione di separatori, numero di separatori che non fungono da separatori (perche' fanno parte di un campo), numero di doppi apici, variabile che segnala la disparita' del numero di doppi apici.

Con leggi_ind_csv.c si leggono le struct generate da crea_ind.c, insieme alle righe associate; l'utente puo' scegliere fra varie opzioni di visualizzazione dati e, se vuole, puo' anche salvare i dati estratti in un file CSV esterno. E' possibile cosi' esaminare in dettaglio ogni singola riga. Le righe con errori salvate su file esterno possono essere corrette manualmente (se non sono troppe!) e poi accodate al file principale (da cui devono essere eliminate le righe con errori).

crea_db.c copia tutti i dati contenuti nel file CSV in un file di struct; la definizione della struct adeguata puo' essere fatta avvalendosi dei dati ottenuti con leggi_csv.c e leggi_ind_csv.c.

mostra_db.c visualizza le struct create con il programma precedente.

Per eliminare byte, che rappresentano spazi vuoti dopo l'ultimo campo di una riga, si puo' usare togli_spazi.c.

Con trasformaf.c e' possibile creare un nuovo file CSV, consentendo all'utente di modificare o eliminare certi byte inutili o fastidiosi; il nuovo file CSV cosi' ottenuto puo' essere piu' comprensibile per l'utente e per leggi_csv.c. Ad esempio, trasformaf.c permette di eliminare il byte 13 della coppia 13-10, usata come terminatore di riga in ambiente windows.

I dati (prelevati da un file CSV) possono anche essere inseriti in un file HTML; questo si puo' fare con crea_html.c.

Attualmente i miei programmi non gestiscono questi casi: eliminazione degli spazi all'inizio di un campo; campi contenenti (come parte dei dati) il byte di fine riga; dati numerici non stringa, (ad esempio int, float, ecc.).

E' possibile che ci siano altre situazioni (dovute a difetti del file CSV) che non ho previsto; le difficolta' nascono anche dal fatto che non esiste uno standard ufficiale, quindi si trovano molte varianti.

crea_db.c, mostra_db.c e crea_html.c sono configurati per operare con il file CSV di esempio, libri_csv.txt; ma e' possibile riaddattarli rapidamente per usarli anche con file strutturati diversamente.


Programmi specifici per file CSV

Leggere un file CSV

Eliminare gli spazi a fine campo in un file CSV

Creare un file indice di struct che descrivono le righe di un file CSV

Leggere un file CSV tramite l'indice; estrarre righe particolari e salvarle in un file CSV esterno

Creare file di struct con i dati di un file CSV

Visualizzare il file di struct

Creare file HTML con i dati del file di struct

File di prova libri_csv.txt

File HTML libri.htm con i dati del file CSV copiati nel file di struct


Programmi di uso generale

Visualizzare i caratteri/byte di un file di qualsiasi tipo

Contare le occorrenze di un byte in un file

Sostituire o eliminare byte in un file

Concatenare due file


Home


www.corradodamiano.it a cura di Corrado Damiano

posta@corradodamiano.it