【问题标题】:DataTable from TextFile?来自文本文件的数据表?
【发布时间】:2012-11-21 04:46:11
【问题描述】:

我接手了另一个开发人员编写的应用程序,它从数据库中读取数据并将其导出。

开发者使用了 DataTables 和 DataAdaptors。

所以,

 _dataAdapter = new SqlDataAdapter("Select * From C....", myConnection);

然后

ExtractedData = new DataTable("CreditCards");
_dataAdapter.Fill(ExtractedData);

ExtractedData 然后被传递以执行不同的功能。

现在有人告诉我,除此之外,我还需要从一些逗号分隔的文本文件中获取相同格式的数据。应用程序执行相同的处理 - 它只是从两个来源获取数据。

所以,我想知道我是否可以将数据读入 DataTable,如上所述,然后从 CSV 文件中添加更多记录。

这可能吗?

【问题讨论】:

  • 如何从文件中确定总列数信息?请显示文件的样本数据。

标签: c# datatable sqldataadapter


【解决方案1】:

您可能需要使用此函数从文件中将数据读入DataTable

public DataTable GetDataSourceFromFile(string fileName)
{
    DataTable dt = new DataTable("CreditCards");
    string[] columns = null;

    var lines = File.ReadAllLines(fileName);

    // assuming the first row contains the columns information
    if (lines.Count() > 0)
    {
        columns = lines[0].Split(new char[] { ',' });

        foreach (var column in columns)
            dt.Columns.Add(column);
    }

    // reading rest of the data
    for (int i = 1; i < lines.Count(); i++)
    {
        DataRow dr = dt.NewRow();
        string[] values = lines[i].Split(new char[] { ',' });

        for (int j = 0; j < values.Count() && j < columns.Count(); j++)
            dr[j] = values[j];

        dt.Rows.Add(dr);
    }
    return dt;
}

【讨论】:

  • 写 i 或 j 时要小心。我错误地写了 dr[j] = values[j];那是两个地方的 j,因为 j 和 i 在外观上相似。谢谢。
【解决方案2】:

绝对有可能。
DataTable 有一个 NewRow 方法,所以我能看到的最简单的蛮力方法是一次读取文本文件一行,解析字符串 (split(",") 然后填充行的字段。然后你需要将新行添加到 DataTable 的 Rows 集合中。
可能有更聪明的方法可以做到这一点,但这似乎相当容易实现(不了解您的架构)。

【讨论】:

    【解决方案3】:

    好的,试试这个:

    public string[] getColumns(bool ColumnNames)
    {
        try {
            StreamReader fileReader = new StreamReader(FileName);
            string line = fileReader.ReadLine;
            fileReader.Close();
            string[] Columns = line.Split(",");
            if (ColumnNames) {
                return Columns;
            }
            int i = 1;
            int c = 0;
            string[] columnsNames = new string[Columns.Count];
            foreach (string column in Columns) {
                columnsNames(c) = "column" + i;
                i += 1;
                c += 1;
            }
            return columnsNames;
        } catch (Exception ex) {
            //log to file    
        }
        return null;
    }
    

    public DataTable ReturnData(bool ColumnNames)
    {
        try {
            DataTable dt = new DataTable();
            foreach ( columnName in getColumns(ColumnNames)) {
                dt.Columns.Add(columnName);
            }
            StreamReader fileReader = new StreamReader(FileName);
            if (ColumnNames) {
                fileReader.ReadLine();
            }
            string line = fileReader.ReadLine;
            while ((line != null)) {
                line = line.Replace(Strings.Chr(34), "");
                dt.Rows.Add(line.Split(","));
                line = fileReader.ReadLine;
            }
            fileReader.Close();
            return dt;
        } catch (Exception ex) {
            //log to file
        }
        return null;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 2023-01-09
      相关资源
      最近更新 更多