读取文件,写入不同的表,如果(流编写器 =..)

本文关键字:如果 文件 读取 | 更新日期: 2023-09-27 18:30:46

我在将文件读取到数据网格视图时遇到了一点问题(更具体地说是 3)。

using (StreamReader sr = new StreamReader(fn))
{
    string[] datarow; int tableno=0;
    colt = sr.ReadLine();
    Console.Out.WriteLine(colt);
    if (colt == "@Table")
    {
        tableno++;//Here tableno is equals 1
        colt = sr.ReadLine();
       // Console.Out.WriteLine(colt);
       // Console.Out.WriteLine(tableno);
    }
    switch (tableno)
    {
      case 1:
                 columns = colt.Split(';');
    Count = columns.Length;
    foreach (string c in columns)
    {
        Table1.Columns.Add(c, typeof(String));
    }
    while (!sr.EndOfStream)
    {
        rowt = sr.ReadLine();
        if (rowt == "@Table") break; //Here program supposed to break this case, go up and increase tableno
        datarow = rowt.Split(';');
        Table1.Rows.Add(datarow);
    }
    dataGridView1.DataSource = Table1;
    sr.Close();
            break;

        case 2:
                columns = colt.Split(';');
    Count = columns.Length;
    foreach (string c in columns)
    {
        Table2.Columns.Add(c, typeof(String));
    }
    while (!sr.EndOfStream)
    {
        rowt = sr.ReadLine();
        if (rowt == "@Table") break;
        datarow = rowt.Split(';');
        Table2.Rows.Add(datarow);
    }
    dataGridView2.DataSource = Table2;
    sr.Close();
            break;

        case 3:
                 columns = colt.Split(';');
    Count = columns.Length;
    foreach (string c in columns)
    {
        Table3.Columns.Add(c, typeof(String));
    }
    while (!sr.EndOfStream)
    {
        rowt = sr.ReadLine();
        if (rowt == "@Table") break;
        datarow = rowt.Split(';');
        Table3.Rows.Add(datarow);
    }
    dataGridView3.DataSource = Table3;
    sr.Close();
            break;
}
}
}

我的文本文件如下所示:

@Table
K1;K2;K3
....
..
@Table
K1;K4
..
..
@Table
K1;K5

运行此代码后,数据仅显示在 GridView1 中。可变表不想增加。有人有想法吗?

读取文件,写入不同的表,如果(流编写器 =..)

您可以通过在

StreamReaderusing范围内创建一个 while 循环来使现有代码工作,并在完成表表后停止关闭读取器(读取器将通过 using 语句为您关闭,因此无论如何这是不必要的)。目前的问题是,当你看到下一个表的开头或旧表的结尾(你的答案和问题不同......)时,你打破了该表的阅读循环,但随后没有什么可以改变流程"上升"并开始处理下一个, 它将在此时退出该方法。

但是,您应该从根本上改变您的方法,因为它非常重复。目前你有 3 张桌子,但如果你有 N 张桌子呢?从维护、测试和可扩展性的角度来看,重复代码是一种不好的做法。例如,如果您的文件格式发生变化,您将不得不在 3 个地方更改它,并测试比您只编写一次的次数多 3 倍。

下面是一个示例,说明如何编写它来处理任意数量的表并重复使用相同的逻辑来读取每个表:

private List<DataTable> ReadDataTables(string fileName)
{
    List<DataTable> tables = new List<DataTable>();
    DataTable currentTable = null;
    using (StreamReader reader = new StreamReader(fileName))
    {   
        while (!reader.EndOfStream)
        {                    
            var currentLine = reader.ReadLine(); // get the next line from the file
            if (String.IsNullOrWhiteSpace(currentLine)) continue; // ignore blank rows
            // skip rows marking end of table, reset the current table
            if (currentLine.StartsWith("@EndTable", StringComparison.OrdinalIgnoreCase))
            {
                currentTable = null;
                continue;
            }
            // initialize a new table
            if (currentLine.StartsWith("@Table", StringComparison.OrdinalIgnoreCase))
            {
                currentTable = new DataTable();
                tables.Add(currentTable); 
                // initialise the columns
                var columns = reader.ReadLine().Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                foreach (var column in columns)
                    currentTable.Columns.Add(column, typeof(String));
                continue;
            }
            if (currentTable == null) continue; // file is not in the format we were expecting
            // add data row
            var dataRow = currentTable.NewRow();
            dataRow.ItemArray = currentLine.Split(new char[] { ';' });
            currentTable.Rows.Add(dataRow);
        }
    }
    return tables;
}

然后,您可以从按钮单击事件处理程序中使用它,如下所示;

var tables = ReadDataTables(fileName);
dataGridView1.DataSource = tables[0];
dataGridView2.DataSource = tables[1];
dataGridView3.DataSource = tables[2];