2
 public class myRows
        {
            public decimal Col1 { get; set; }
            public decimal Col2 { get; set; }
            public decimal Col3 { get; set; }
            public decimal Col4 { get; set; }
            public decimal Col5 { get; set; }
            public decimal Col6 { get; set; }
            public string myDateTimeCol { get; set; }

            public myRows(string str)
            {
                var fields = str.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

                Col1 = Convert.ToDecimal(fields[0]);
                Col2 = Convert.ToDecimal(fields[1]);
                Col3 = Convert.ToDecimal(fields[2]);
                Col4 = Convert.ToDecimal(fields[3]);
                Col5 = Convert.ToDecimal(fields[4]);
                Col6 = Convert.ToDecimal(fields[5]);
                myDateTimeCol = string.Format("{0} {1} {2} {3} {4}", fields[6], fields[7], fields[8], fields[9], fields[10]);
            }
        }

然后我读了我的日志文件

var rows = new List<myRows>();
var sr = new StreamReader(txtFileToImport.Text);

while (!sr.EndOfStream)
       {
          string s = sr.ReadLine();
           if (!String.IsNullOrEmpty(s.Trim()))
               {
                  rows.Add(new myRows(s));
                }
        }

sr.Close();
dataGridView_preView.DataSource = rows;

在此处输入图像描述

这段代码面临的问题是,如果输入 LogFile 有超过 12 列或更多列,我会得到一个索引超出范围异常

有没有我可以重构代码以使其处理具有任意数量列的任何日志文件。要处理的日志文件具有不同数量的列,我唯一的保证是日期列在所有情况下始终是最后一列。

4

2 回答 2

0

试试这个:

public class myRows
        {
            public List<decimal> Cols = new List<decimal>();
            public string myDateTimeCol { get; set; }
            public string myVariableCols {
               get{
                  var sb = new StringBuilder();
                  for (var x = 0; x < Cols.length; x++){
                     sb.Append( Cols[x].ToString() );
                     if (x < Cols.length - 1) sb.Append("   ");
                  }
                  return sb.ToString();
               }
            }

            public myRows(string str)
            {
                var fields = str.Split(new[]{' '}, StringSplitOptions.RemoveEmptyEntries);
                int x;
                for (x = 0; x < fields.length-5;x++){
                   decimal d;
                   if (Decimal.TryParse(fields[x], out d)){
                      Cols.Add(d);
                   }
                }
                myDateTimeCol = string.Format("{0} {1} {2} {3} {4}", fields[x++], fields[x++], fields[x++], fields[x++], fields[x++]);
            }
        }

如果大于 4,这应该适用于任何列大小。在您的数据网格中,您将只有两个数据绑定列:“myVariableCols”和“myDateTimeCol”。

于 2012-12-06T10:18:59.097 回答
0

在不使用任何列表的情况下,我对此有完全不同的方法。请原谅编码,这只是一个快速测试。

首先,我将使用 DataTable。

public DataTable dt = new DataTable();

我从每一行读取的数据将存储在一个字符串类型的数组中。

public string[] data;

我们需要做的第一件事是确定数据文件中有多少列。下面我计算实例数,然后生成新的所需列数。

public void addcolumns()
        {

            using (StreamReader reader = new StreamReader(@"C:\DataColumnTest.txt"))
            {
                string s = reader.ReadLine();
                string[] col = s.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);


                foreach (var a in col)
                {
                    dt.Columns.Add(new DataColumn());
                }
            }
        }

接下来,在哪里必须添加我们的 DataTable 的行。我们的行数据中的列数应该始终与我们的 DataTable 中的列数相匹配,并且在最初执行此操作的位置应该每次都有效:-

Public void addRows()
    {
        var sr = new StreamReader(@"C:\DataColumnTest.txt");

        while (!sr.EndOfStream)
        {
            string s = sr.ReadLine();
            if (!String.IsNullOrEmpty(s.Trim()))
            {
                data = null;
                data = s.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                dt.Rows.Add(data);
            }

        }

        sr.Close();
    }

我为这个快速示例所做的就是在表单加载中调用这些方法,然后为 DataGrid 添加数据源:-

 private void Form1_Load(object sender, EventArgs e)
        {

            addcolumns();
            addRows();
            dataGridView1.DataSource = dt;
        }

我知道会有更清洁的方法来做到这一点,但它确实有效,与我看到的其他示例不同。

希望这可以帮助。

*** 编辑 ****

这是我使用的数据以及结果。

在此处输入图像描述

在此处输入图像描述

于 2012-12-06T15:42:02.250 回答