Tôi đã tự hỏi liệu có ai biết chức năng C# hiệu quả để đọc tệp phân tách tab thành một dữ liệu không?Chức năng hiệu quả để đọc một tệp được phân tách vào DataTable
Cảm ơn
Tôi đã tự hỏi liệu có ai biết chức năng C# hiệu quả để đọc tệp phân tách tab thành một dữ liệu không?Chức năng hiệu quả để đọc một tệp được phân tách vào DataTable
Cảm ơn
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'));
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];
}
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. –
Cách khác là phân tích cú pháp tệp theo cách thủ công –
này hiện đang sử dụng các phương pháp LINQ .First()
và .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'));
}
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ớ –
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
đ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 –