2009-07-22 9 views

risposta

0

Ecco un modo per farlo ...

 var dt = new DataTable(); 
     dt.Columns.Add(new DataColumn("Column1", typeof(string))); 
     dt.Columns.Add(new DataColumn("Column2", typeof(string))); 
     dt.Columns.Add(new DataColumn("Column3", typeof(string))); 

     var lines = File.ReadAllLines(@"c:\tabfile.txt"); 
     foreach(string line in lines) 
      dt.Rows.Add(line.Split('\t')); 
+1

se il file è veramente grande si stanno creando 2 copie dello stesso grande file in memoria –

+0

Sì, avrei dovuto dirlo. Volevo mantenere l'esempio semplice. Un lettore di stream sarebbe più appropriato se i file fossero grandi. – Steve

+0

questo è perfetto l'ho usato per il mio progetto –

5
public System.Data.DataTable GetDataTable(string strFileName) 
{ 
    System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + System.IO.Path.GetDirectoryName(strFileName) + ";Extended Properties = \"Text;HDR=YES;FMT=TabDelimited\""); 
    conn.Open(); 
    string strQuery = "SELECT * FROM [" + System.IO.Path.GetFileName(strFileName) + "]"; 
    System.Data.OleDb.OleDbDataAdapter adapter = new System.Data.OleDb.OleDbDataAdapter(strQuery, conn); 
    System.Data.DataSet ds = new System.Data.DataSet("CSV File"); 
    adapter.Fill(ds); 
    conn.Close(); 
    return ds.Tables[0]; 
} 
+0

C'è un modo per farlo senza Jet? Per quelli di noi con macchine in cui l'accesso è vietato. –

+0

L'altro modo è analizzare il file manualmente –

15

Questo utilizza attualmente i metodi di LINQ .First() e .Skip() entrambi sono facili da ricreare, se è necessario utilizzare questo su. Net 2.0

//even cooler as an extension method 
static IEnumerable<string> ReadAsLines(string filename) 
{ 
    using (var reader = new StreamReader(filename)) 
     while (!reader.EndOfStream) 
      yield return reader.ReadLine(); 
} 

static void Main() 
{ 
    var filename = "tabfile.txt"; 
    var reader = ReadAsLines(filename); 

    var data = new DataTable(); 

    //this assume the first record is filled with the column names 
    var headers = reader.First().Split('\t'); 
    foreach (var header in headers) 
     data.Columns.Add(header); 

    var records = reader.Skip(1); 
    foreach (var record in records) 
     data.Rows.Add(record.Split('\t')); 
} 
Problemi correlati