2012-11-19 83 views
4

我有这段代码,它读取一个文本文件[制表符分隔]并返回一个数据表。但问题是,它把文件或记录的第一行作为标题,并将其余行作为记录来显示,记录的数量减去-1 ,所以现在我想让代码读取文件的所有内容为记录。从文本文件填充数据表

这里是代码:

streamReader reader = new streamReader (filePath); 
string line = reader.readLine(); 
Datatable dt = new Datatable(); 
DataRow row; 
string[] value = line.Split('\t'); 

foreach(string dc in value) 
{ 
dt.columns.add(New DataColumn(dc)); 
} 

while(!reader.endofStream) 
{ 
    value = reader.ReadLine().split('\t'); 

    if (value.Length == dt.Columns.Count) 
{ 
    row = dt.NewRow(); 
    row.ItemArray = value; 
    dt.Rows.Add(row); 
} 

} 

return dt; 

当我尝试删除

foreach(string dc in value) 
{ 
dt.columns.add(New DataColumn(dc)); 
} 

,并依赖于它的所有行代码中,DT任何回报。

我该如何解决它?

回答

5

如果你知道没有标题,我假设你不知道列的名称,是吗?然后,你需要添加 “匿名” 列,而不是:

DataTable dt = new DataTable(); 
while (reader.Peek() >= 0) 
{ 
    string line = reader.ReadLine(); 
    string[] fields = line.Split('\t'); 
    if (dt.Columns.Count == 0) 
    { 
     foreach (string field in fields) 
     { 
      // will add default names like "Column1", "Column2", and so on 
      dt.Columns.Add(); 
     } 
    } 
    dt.Rows.Add(fields); 
} 
+0

的DT返回Nothing – Djama

+1

不,它不需要。如果文件是空的,则dt是一个空的'DataTable'。如果文件包含行,DataTable具有'n' DataColumns,其中'n'是第一行中的字段数。 –

3
DataTable dt = new DataTable(); 
var lines = File.ReadAllLines(strPath).ToList(); 
dt.Columns.AddRange(lines.First().Split(new char[] { '\t' }).Select(col => new DataColumn(col)).ToArray()); 
lines.RemoveAt(0); 
lines.Select(x => x.Split(new char[] { '\t' })).ToList().ForEach(row => dt.Rows.Add(row)); 

使用此测试数据

List<string> lines = new List<string>(); 
lines.Add("Col1\tCol2\tCol3"); 
lines.Add("aaa\tbbb\tccc");