4

我有这个代码块,它读取一个文本文件 [Tab delimited] 并返回一个数据表。但问题是它将文件或记录的第一行视为标题,并将其余行显示为记录,将记录数减去 - 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 什么都不返回。

我该如何解决?

4

2 回答 2

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);
}
于 2012-11-19T09:22:30.320 回答
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");
于 2012-11-19T09:25:18.817 回答