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

次に、LogFileを次のように読み取ります

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 個以上の列がある場合、範囲外の例外が発生することです。

コードをリファクタリングして、任意の数の列を持つ任意の LogFile を処理することができます。処理されるログ ファイルにはさまざまな数の列があります。唯一の保証は、すべての場合において日付列が常に最後の列になることです。

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」の 2 つのデータ バインド列しかありません。

于 2012-12-06T10:18:59.097 に答える
0

リストを使用せずに、これとはまったく異なるアプローチをとっています。コーディングをお許しください。これは簡単なテストです。

まず、DataTable を使用します。

public DataTable dt = new DataTable();

各行から読み取ったデータは、Type String の配列に格納されます。

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

この簡単な例では、Load フォームでこれらのメソッドを呼び出し、DataGrid のデータソースを追加するだけです。

 private void Form1_Load(object sender, EventArgs e)
        {

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

これを行うためのよりクリーンな方法があることはわかっていますが、投稿された他の例とは異なり、機能します。

お役に立てれば。

*** 編集 ****

これが私が使用したデータと結果です。

ここに画像の説明を入力

ここに画像の説明を入力

于 2012-12-06T15:42:02.250 に答える