[c#] OLEDB Vs File di testo Delimitati con virgola - Urgente

giovedì 08 aprile 2010 - 15.19

qeiciccio Profilo | Newbie

Carissimi,
ecco il problema del giorno.
Ho la solita applicazione winform che deve caricare un file csv (di testo) delimitato con tanto di separatore.
Il separatore è la virgola
Qui di seguito riporto il codice utilizzato per il caricamento.
private DataSet CSVToDataSet(String PathFile ) { OleDbConnection cn = new OleDbConnection (); OleDbCommand cm = new OleDbCommand (); OleDbDataAdapter da = new OleDbDataAdapter(); DataSet ds = new DataSet(); String FileName = Path.GetFileName(PathFile); String FolderName = Path.GetDirectoryName(PathFile); try { cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FolderName + ";Extended Properties=\"Text;HDR=No;FMT=Delimited(,)\""; cm.Connection = cn; cm.CommandText = "SELECT * FROM [" + FileName + "]" + " ORDER BY F1"; cn.Open(); da.SelectCommand = cm; da.SelectCommand.Connection = cn; FileName = FileName.Substring(0, FileName.LastIndexOf(".")); da.Fill(ds, FileName); cn.Close(); } catch (Exception EX) { MessageBox.Show(EX.Message); ds.Dispose (); ds=null; } return ds; }

In pratica cosi come è il dataset viene restituito con una tabella monocolonna, mentre nel file ce ne sono 7.
Se sostituisco la virgola con il punto e virgola nel file il caricamento avviene in maniera normale, ma siccome il separatore di default viene impostato su ogni macchina nel registro macchina non posso neanche pensare di fare una replace a palla.

Adesso la domanda come faccio a dire ad OleDB che deve usare come delimitatore la virgola e come separatore delle migliaia il punto?
Vi prego aiutatemi

kataklisma Profilo | Senior Member

Non potresti usare un delimitatore piu complesso, per esempio "#,#" ?
------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

qeiciccio Profilo | Newbie

No perchè il file proviene da una server SAP e quindi non dipende da me la scrittura ma da un altro gruppo.

kataklisma Profilo | Senior Member

>No perchè il file proviene da una server SAP e quindi non dipende
>da me la scrittura ma da un altro gruppo.

Quindi vorresti capire qual'è il separatore dinamicamente, in quanto puo essere diverso in ogni file?
------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

qeiciccio Profilo | Newbie

No Il separatore nel file è fisso ed è la virgola
quello che può variare è il separatore che è specificato su ogni macchina nella chiave di registro HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Text prorpietà Format
ed io vorrei liberarmi da tale dipendenza.
Cercando sulla doc on line ho visto che esiste la possibilità di specificare tali info in un apposito file che si chiama schema.ini ma non mi è ancora chiaro come viene gestita tutta la faccenda attravero questo file!

kataklisma Profilo | Senior Member

>No Il separatore nel file è fisso ed è la virgola
>quello che può variare è il separatore che è specificato su ogni
>macchina nella chiave di registro HKEY_LOCAL_MACHINE \ SOFTWARE
>\ Microsoft \ Jet \ 4.0 \ Engines \ Text prorpietà Format
>ed io vorrei liberarmi da tale dipendenza.

Ma gia lo fai, con FMT=Delimited(,) indichi alla proprietà format il separatore , !


------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

qeiciccio Profilo | Newbie

peccato che non funzioni cosi
OLEDB é deficiente ed ha bisogno del file schema.ini

tonyexpo Profilo | Senior Member

>Carissimi,
>ecco il problema del giorno.
>Ho la solita applicazione winform che deve caricare un file csv
>(di testo) delimitato con tanto di separatore.
>Il separatore è la virgola
>Qui di seguito riporto il codice utilizzato per il caricamento.
>private DataSet CSVToDataSet(String PathFile )
> {
> OleDbConnection cn = new OleDbConnection ();
> OleDbCommand cm = new OleDbCommand ();
> OleDbDataAdapter da = new OleDbDataAdapter();
> DataSet ds = new DataSet();
> String FileName = Path.GetFileName(PathFile);
>String FolderName = Path.GetDirectoryName(PathFile);
>
> try
> {
>cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
>Source=" +
> FolderName +
>";Extended Properties=\"Text;HDR=No;FMT=Delimited(,)\"";
> cm.Connection = cn;
>cm.CommandText = "SELECT * FROM [" + FileName + "]" + " ORDER
>BY F1";
>
> cn.Open();
>
> da.SelectCommand = cm;
> da.SelectCommand.Connection = cn;
>
>FileName = FileName.Substring(0, FileName.LastIndexOf("."));
> da.Fill(ds, FileName);
> cn.Close();
>
> }
> catch (Exception EX)
> {
> MessageBox.Show(EX.Message);
> ds.Dispose ();
> ds=null;
> }
> return ds;
>
> }
>
>In pratica cosi come è il dataset viene restituito con una tabella
>monocolonna, mentre nel file ce ne sono 7.
>Se sostituisco la virgola con il punto e virgola nel file il
>caricamento avviene in maniera normale, ma siccome il separatore
>di default viene impostato su ogni macchina nel registro macchina
>non posso neanche pensare di fare una replace a palla.
>
>Adesso la domanda come faccio a dire ad OleDB che deve usare
>come delimitatore la virgola e come separatore delle migliaia
>il punto?
>Vi prego aiutatemi
>




Ciao

.NET ha un potente motore di gestione delle stringhe che ti consiglio di usare al posto di OLEDB


public DataTable CSV2DataTable(string fname)
{

var dt = new DataTable();
var r = new StreamReader(fname);

while (!r.EndOfStream)
{
var items = r.ReadLine().Split(",".ToCharArray());
if (dt.Columns.Count==0)
dt.Columns.AddRange((from i in items select new DataColumn(i, typeof(string))).ToArray());

var dr =dt.NewRow();
for (int i=0; i<items.Length; i++)
dr[i]=items[i];

dr.Rows.Add(dr);
}
return dt;
}


che ne dici?

Antonio Esposito
MCPD, MCTS, MCP

http://blogs.dotnethell.it/espositos

kataklisma Profilo | Senior Member

>peccato che non funzioni cosi
>OLEDB é deficiente ed ha bisogno del file schema.ini
Allora crea un file schema.ini con questa sintassi all'interno :

[tuocsv.txt] ColNameHeader=False CharacterSet=ANSI Format=Delimited(,)

Il driver fa tutto in automatico ;)

Se non ti piace quest'approccio puoi sempre trattare il file come un qualsiasi file di testo e gestirlo come vuoi a livello di stringhe!
------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

qeiciccio Profilo | Newbie

Non ha funzionato neanche cosi, cacchioooo
Faccio prima a scrivere un parser!

kataklisma Profilo | Senior Member

Tutto questo è molto strano!

Fai prima a gestire il file tramite parser.


------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

qeiciccio Profilo | Newbie

Solo una domanda in questo modo vengono crate al volo (solo una volta) le colonne del datatable ma l'istruzione qui sotto riportata non viene interperetata dal c# mi da un fortio di errori
dt.Columns.AddRange((from i in items select new DataColumn(i, typeof(string))).ToArray());

kataklisma Profilo | Senior Member

>Solo una domanda in questo modo vengono crate al volo (solo una
>volta) le colonne del datatable ma l'istruzione qui sotto riportata
>non viene interperetata dal c# mi da un fortio di errori
>
>dt.Columns.AddRange((from i in items select new DataColumn(i,
>typeof(string))).ToArray());
Che tipo di errori?

------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

qeiciccio Profilo | Newbie

Parlando con un amico, mi ha detto che la sintassi è quella di LINQ ma io ho dimenticato di dirvi che il frm.net di riferimento è il 2.0.

kataklisma Profilo | Senior Member

Ecco risolto il problema :)

Hahahahaahha!

Buona giornata!
------------------------------------------
Ignazio Catanzaro

http://blogs.dotnethell.it/swdev/

qeiciccio Profilo | Newbie

Ok buona giornata ad entrmbi e grazie del supporto!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5