Newsgroup: it.comp.lang.visual-basic
Titolo: csv

ciao a tutti,
dovrei gestire la scrittura e lettura di file csv, sapreste consigliarmi 
qualche classe già pronta?
In particolare data una datatable vorrei esportare i record in un file csv e 
viceversa.
Grazie
 

 viceversa.
Di norma č molto semplice da datatable a csv, scorri le intestazioni e poi
i dati:
http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/e047fc2c-ec9b-4912-9cb3-c510db17754f
Il contrario forse č piů complesso, non l'ho letto:
http://social.msdn.microsoft.com/Forums/en-US/vblanguage/thread/87cc5a7c-e0ce-495e-9ae6-8fe17b89356b
http://www.devx.com/vb2themax/Tip/19703
http://www.devx.com/vb2themax/Tip/19704


Grazie ma non vanno bene. Anch'io avevo fatto qualcosa di simile ma non c'è 
la gestione del carattere separatore e di escape....
in realtà avevo messo i campi fra virgolette e separati da una , tipo
"città","prezzo","punteggio":
toglo il 1° e ultimo carattere e uso split usando come separatore  questo 
","
Ma potrebbe presentarsi il caso in cui questa sequenza si trovi all'interno 
di un campo....
Possibile che non vi sia già una qualche funzione in .net?
Ciao
 

 Possibile che non vi sia già una qualche funzione in .net?
Per capire questi file li crei e rileggi tu?
In caso puoi sostituire con una sequenza "improbabile" di caratteri.
Esempio fai un replace di "," con "§#^ç" e poi rifai la trasformazione
versa in rilettura.
Se sono files che ti vengono dati allora devi trovare il modo, e forse c'è
qualcosa di pronto, ma sinceramente non saprei.

 all'interno di un campo....
Dipende da come la vuoi gestire.
Noi, ad esempio, imponiamo che non vi sia il carattere separatore
all'interno dei dati. Nel nostro caso è il ";".
Questo perchè noi carichiamo milionate di record via bulk-insert, quindi
non possiamo permetterci di controllare cosa è presente nel file.
In alternativa la soluzione più semplice ci viene dal linguaggio C
Puoi utilizzare la "," come separatore. Nel momento in cui devi
inserirla invece come dati, fai una replace(Testo, ",", "\,")
Avremmo che la seguente riga:
Nome1,Nome2,Frase,Valore
"Pippo","Pluto","Paperino, dove sei? Su ICLVB?",1500,30
diventerebbe
Nome1,Nome2,Frase,Valore
"Pippo","Pluto","Paperino\, dove sei? Su ICLVB?",1500\,30
A quel punto poi ti fai un parser per riottenere la stringa corretta.
Nicola

 In caso puoi sostituire con una sequenza "improbabile" di caratteri.
No no, mi serve un metodo sicuro al 100% .
Ora indago un attimo poi vi aggiorno se trovo qualcosa.
Ciao
 

 wrote in
news:4c850f65$0$6827$
5fc...@news.tiscali.it
: 

usa un metodo piu' robusto...
se il csv ti venisse passato da altri, ti avrebbero dato (spero...) anche i 
requisiti e i criteri con cui crearlo, compreso come gestire questi casi 
particolari.
visto che invece pare tu non abbia direttive da seguire suppongo tu lo stia 
creando per 'uso interno'.
se usi qualcosa tipo xml e' gia' prevista la gestione di caratteri speciali 
e la presenza del separatore all'interno dei dati.
senza contare che i dati in xml sono spesso piu' leggibili di un csv 
(casomai servisse) e di codice per leggere/scrivere xml con .net ne trovi a 
pacchi.
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

Nel mio caso il file CSV può essere creato da altri programmi( excel etc...)
Che ne dite della funzione  TextFieldParser?
Nel caso in cui i miei dati sono contenuti in una griglia posso usare il 
codice corrente:
Stream stream;
DataObject dataObject = this.exportDeviceControl.GetDataContent();//dati 
all'interno del clipboard
            if (dataObject == null)
            {
                MessageBox.Show("Nessun dato selezionato");
                return;
            }
            if (!dataObject.GetDataPresent("Csv"))
            {
                MessageBox.Show("Formato dati non supportato");
                return;
            }
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                if ((stream = saveFileDialog.OpenFile()) != null)
                {
                    StreamWriter sw = new StreamWriter(stream);
                    object data = dataObject.GetData("Csv");
                    sw.Write(data.ToString());
                    sw.Close();
                }
 

 Che ne dite della funzione  TextFieldParser?
Sarebbe C# il codice che hai postato. :-)
Comunque no, non saprei dirti. La classe è stata creata per quello, ma
non saprei quanto funzioni bene e quanto sia flessibile.
Noi abbiamo creato dei motori ad-hoc perchè facciamo anche una serie di
modifiche e controlli sui dati.
Nicola

 Nicola
ok ,thanks 

 di un campo....
Ovviamente; il motivo per cui esiste il qualificatore di testo nei
file csv è proprio questo, chiaramente però tu non puoi pretendere di
fare uno slip così "alla maledetta", ma devi fare il parsing di ogni
riga che leggi per controllare se i " sono pari o dispari e decidere
quindi se è un record già completo, o se devi accodare la riga
seguente; a quel punto, sempre sfruttando i " verifichi anche se il
separatore di campo è dento un qualificatore o no...
E, no, non c'è una funziona già bella e pronta che lo fa...