【问题标题】:How to Read text file to DataTable [closed]如何将文本文件读取到 DataTable [关闭]
【发布时间】:2013-12-31 16:14:30
【问题描述】:

我想从 txt 文件中提取数据并将其放入 DataTable。 txt文件中的内容格式如下:

sometext1:sometext2:sometext3
sometext4:sometext5:sometext6
sometext7:sometext8:sometext9
...

每一行代表一行,每一列用“:”字符分隔。

我试过这样做:

            DataTable tbl = new DataTable();

            using (StreamWriter sw = File.CreateText(path))
            {
                string[] rows = content.Split('\n');
                foreach (string s in rows)
                {
                    string[] columns = s.Split(':');
                    foreach (string t in columns)
                    {
                        sw.WriteLine(t);
                    }

                }
            }

如何读取此文件并将其添加到 DataTable?

【问题讨论】:

  • 您在问题中包含的唯一标签与您提出的问题无关。什么是DataTable?你用什么语言编程?你做了什么尝试来解决这个问题?
  • 我不确定你想做什么。您是要读取 -file- 并将数据插入数据库,还是要读取 -database- 并将数据写入文件?我问这个是因为您说您想从文件中提取数据,但是您的代码示例看起来就像您在写入文件

标签: c# datatable


【解决方案1】:

这是完成工作的简单方法

public 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;
}

【讨论】:

  • 如果文本文件多于 3 列,则需要将“for(int cIndex=0; cIndex
【解决方案2】:

这是一个优秀的类,它将使用数据结构将 CSV 数据复制到数据表中以创建 DataTable:

http://www.codeproject.com/Articles/11698/A-Portable-and-Efficient-Generic-Parser-for-Flat-F

这里也讨论过这个话题: How to read a CSV file into a .NET Datatable

不过,如果你愿意自己写代码,有一个例子:

Dim csvFileFolder As String = "C:\YourFileFolder"
Dim csvFileName As String = "YourFile.csv"

'Note that the folder is specified in the connection string,
'not the file. That's specified in the SELECT query, later.
Dim connString As String = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" _
    & csvFileFolder & ";Extended Properties=""Text;HDR=No;FMT=Delimited"""
Dim conn As New Odbc.OdbcConnection(connString)

'Open a data adapter, specifying the file name to load
Dim da As New Odbc.OdbcDataAdapter("SELECT * FROM [" & csvFileName & "]", conn)
'Then fill a data table, which can be bound to a grid

Dim dt As New DataTableda.Fill(dt)

它在 VB.NET 中,如果你不能将它翻译成 C#,请告诉我。

问候。

【讨论】:

  • 我有一个问题。假设部署到的机器没有安装办公软件,请使用此代码部署解决方案应该包括哪些组件?谢谢。
【解决方案3】:

嗯,你大概有你的数据在这里:

string[] rows = content.Split('\n');
foreach (string s in rows)
{
    string[] columns = s.Split(':');
    foreach (string t in columns)
    {
        // each data element
    }
}

如果您定义了DataTable,则可以使用非常相似的构造向其中添加行。我不知道你表的结构,但基本上你可以这样做:

string[] rows = content.Split('\n');
foreach (string s in rows)
{
    string[] columns = s.Split(':');
    var dataRow = someDataTable.NewRow();

    dataRow["someColumnName"] = columns[0];
    dataRow["anotherColumnName"] = columns[1];
    dataRow["someOtherColumnName"] = columns[2];
    // and so on...

    someDataTable.Rows.Add(dataRow);
}

如果DataTable的列没有强命名,也可以按索引添加项目:

dataRow.Item[0] = columns[0];
dataRow.Item[1] = columns[1];
// and so on...

【讨论】:

    【解决方案4】:

    下面将按照您概述的方式执行整个过程。

    var table = new DataTable();
    
    var fileContents = File.ReadAllLines("yourFile");
    
    var splitFileContents = (from f in fileContents select f.Split(':')).ToArray();
    
    int maxLength = (from s in splitFileContents select s.Count()).Max();
    
    for (int i = 0; i < maxLength; i++)
    {
        table.Columns.Add();
    }
    
    foreach (var line in splitFileContents)
    {
        DataRow row = table.NewRow();
        row.ItemArray = (object[])line;
        table.Rows.Add(row);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 1970-01-01
      • 2017-05-24
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      相关资源
      最近更新 更多