从文本文件创建DataTable并拆分

时间:2018-02-02 07:03:07

标签: c# winforms datatable report

这将是我的文本文件(30行)

OrderNo:37374
OrderQuantity:250
BarcodeQR:584,25478Klkd28
NormalBarcode:1565484864
.......
.......
.......

这是代码:

public DataTable DTforReport()
{
    DataTable dt = new DataTable();
    DataColumn col = new DataColumn("test");
    col.DataType = System.Type.GetType("System.String");
    dt.Columns.Add(col);

    string[] lines = File.ReadAllLines("C:\\Users\\abc\\Desktop\\abc.txt");
    foreach (var line in lines)
    {
        var segments = line.Split(';');
        foreach (var seg in segments)
        {
            DataRow dr = dt.NewRow();
            dr[0] = seg;
            dt.Rows.Add(dr);
        }
    }
    return dt;
}

我希望我的输出像这样

 OrderNo  OrderQuantity   BarcodeQR
  37374       250       584,25478Klkd28

如何更改代码才能实现此目的?

3 个答案:

答案 0 :(得分:0)

您只生成了一列。更改您的代码,如下所示,以查看您想要的结果:

public DataTable DTforReport()
{
    DataTable dt = new DataTable();
    string[] lines = File.ReadAllLines("C:\\Users\\abc\\Desktop\\abc.txt");
    DataRow dr = dt.NewRow();

    for (int i = 0; i < lines.Length; i++)
    {
        DataColumn col = new DataColumn(lines[i].Split(':')[0]);
        col.DataType = Type.GetType("System.String");
        dt.Columns.Add(col);
        var segment = lines[i].Split(':')[1];               
        dr[i] = segment;                
    }

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

答案 1 :(得分:0)

我建议你修改你的方法,如下所示:

public DataTable DTforReport()
{
    DataTable testTable = new DataTable("Test");
    testTable.Columns.Add("OrderNo");
    testTable.Columns.Add("OrderQuantity");
    testTable.Columns.Add("BarcodeQR");
    string[] lines = File.ReadAllLines("C:\\Users\\abc\\Desktop\\abc.txt");
    foreach (var line in lines)
    {
        DataRow dRow = testTable.NewRow();
        var segments = line.Split(';');
        for (int i = 0; i < segments.Length; i++)
        {
            var colValues = segments[i].Split(':');
            dRow[i] = colValues[1];
        }
        testTable.Rows.Add(dRow);
    }
    return testTable;
}

很少有改进建议:

  • 我已经提供了静态列名称,如果您想要添加更多名称,或者将来可能会更改,则意味着您可以在数据表中创建动态列。
  • 如果您对输入值有疑问,请使用正确的验证
  • 在某种意义上的验证,在通过索引访问它们之前确保分割的值,否则它们可能以IndexOutOfRangeException结束

答案 2 :(得分:0)

DataTable dt = new DataTable();
string[] lines = File.ReadAllLines("C:\\Users\\abc\\Desktop\\abc.txt");
var firstLine = lines.First();
var columns = firstLine.Split(';');

for (var icount = 0; icount < columns.Count(); icount++)
{
    var colName = columns[icount].Contains(":") ? columns[icount].Split(':')[0] : "Column" + icount;
    var dataCol = new DataColumn(colName);
    dataCol.DataType = System.Type.GetType("System.String");
    dt.Columns.Add(dataCol);
}

foreach (var line in lines)
{
    DataRow dr = dt.NewRow();
    var segments = line.Split(';');
    for (var icount = 0; icount < segments.Count(); icount++)
    {
        var colVal = segments[icount].Contains(":") ? segments[icount].Split(':')[1] : "";
        dr[icount] = colVal;
    }
    dt.Rows.Add(dr);
}

*每行的列数必须相同。