2009-07-22 22 views

Trả lời

0

Dưới đây là một cách để làm điều đó ...

 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

nếu tệp thật sự lớn, bạn đang tạo 2 bản sao của cùng một tệp lớn trong bộ nhớ –

+0

Vâng, tôi nên đề cập đến điều đó. Tôi muốn giữ ví dụ đơn giản. Trình đọc luồng sẽ phù hợp hơn nếu tệp lớn. – Steve

+0

điều này là hoàn hảo tôi sử dụng này cho dự án của riêng tôi –

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ó cách nào để làm điều này mà không có máy bay phản lực? Đối với những người trong chúng ta có máy móc mà Access bị cấm. –

+0

Cách khác là phân tích cú pháp tệp theo cách thủ công –

15

này hiện đang sử dụng các phương pháp LINQ .First().Skip() cả hai đều dễ dàng để tái tạo nếu bạn cần phải sử dụng này trên. 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')); 
} 
Các vấn đề liên quan