高效的函数将分隔符文件读入 DataTable

13

我想知道是否有一种高效的c#函数,可以将制表符分隔的文件读取到数据表中?

谢谢!

4个回答

23

目前使用的是 LINQ 方法 .First().Skip() 两个方法,如果你需要在 .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'));
}

6
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];
 }

有没有不使用Jet的方法来完成这个任务?对于那些无法使用Access的机器,这很重要。 - Tom Kidd

0
DataTable ConvertToDataTable(string filePath, int numberOfColumns)
{
    DataTable tbl = new DataTable();

    for (int col = 0; col < numberOfColumns; col++)
        tbl.Columns.Add(new DataColumn("Column" + (col + 1).ToString()));


    string[] lines = System.IO.File.ReadAllLines(filePath);

    foreach (string line in lines)
    {
        var cols = line.Split(' ');

        DataRow dr = tbl.NewRow();
        for (int cIndex = 0; cIndex < 3; cIndex++)
        {
            dr[cIndex] = cols[cIndex];
        }

        tbl.Rows.Add(dr);
    }

    return tbl;
}

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

这是一种实现方法...

        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
如果文件非常大,您正在内存中创建两个相同的大文件副本。 - Arsen Mkrtchyan
是的,我应该提到这一点。我想保持示例简单。如果文件很大,使用流读取器会更合适。 - Steve
这非常完美,我已经在自己的项目中使用了它。 - JOE SKEET

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接