【问题标题】:Covert Text file data to Datatable将文本文件数据转换为数据表
【发布时间】:2016-04-23 12:15:29
【问题描述】:

我的文本文件包含此类数据。我想从文本文件中读取这些数据并将其转换为数据表。

FacilityID:   12787
FacilityName: ACME Medical Center
Facility Location: 
RecordID:            16611730-19049181-20529397-14136226
Patient:           Kistra Halos
Gender:            Female
DOB:               7/20/1955

读取此输入时,它不会像这样在数据表中显示输出

FacilityID:   12787
FacilityName: ACME Medical Center
Facility Location: 
RecordID:            16611730-19049181-20529397-14136226
Patient:           Kistra Halos
Gender:            Female
DOB:               7/20/1955

但我希望它是:

FacilityID  FacilityName  Facility Location  RecordID  Patient  Gender  DOB
12787       ACME Medical                    16611730-. Kistra   Female 7/20/1955

var table = new DataTable();

    var fileContents = File.ReadAllLines(@"C:\simple.txt");

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

我想对其进行搜索、排序操作。那么我该如何转换呢。

【问题讨论】:

  • 为什么不逐行读取文件并将信息写入您的DataTable?你试过什么吗?
  • @AndyKorneyev 是的,我已经尝试过了,我更新了问题

标签: .net c#-4.0 datatable


【解决方案1】:

您似乎可以在每行中查找第一次出现的冒号。前面的部分是列名,后面的部分是值。

试试这个方法:

DataTable table = new DataTable();
var lines = File.ReadLines(pathToFile).Where(l => l.Contains(':'));
foreach (string line in lines)
{
    int index = line.IndexOf(':');
    string column = line.Trim().Remove(index);
    string value = line.Trim().Substring(index + 1).Trim();
    DataColumn col = table.Columns[column];
    if (col == null)
        col = table.Columns.Add(column);
    bool isNewRecord = col.Ordinal == 0;
    DataRow row = isNewRecord ? table.Rows.Add() : table.Rows[table.Rows.Count - 1];
    row.SetField(column, value);
}

然后您可以使用Linq-To-DataTable 对表格进行排序或查找特定行。

例如:

var rows = table.AsEnumerable().Where(row => row.Field<string>("FacilityID") == "12787");
DataRow firstRow = rows.FirstOrDefault();
if(firstRow != null)
{
     // for example:
     string patient = firstRow.Field<string>("Patient"); // Kistra Halos
     // ....
}

【讨论】:

  • 蒂姆:答案非常好!!!除了 Datatable 之外,我们还有其他方法吗?意味着我们可以从文本文件中检索数据,使用 Linq 或过滤它。
  • 当然。但我不知道你有什么问题。也许你应该发布一个问题。你可以让我知道,我会尽力回答。
猜你喜欢
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 2022-07-13
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
相关资源
最近更新 更多