我有这段代码,它读取文本文件[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什么都不返回。
我该如何解决?
答案 0 :(得分: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);
}
答案 1 :(得分: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");