0

テキストファイルを読み込んでデータが表示されているのですが、上記のテキストファイルはログファイルに関するものなので、できればDataGridView..を使わずにそのログファイルを月単位で表示したいです。DataTable

private void BtnUser_Click(object sender, EventArgs e)
{
  dgv1.Columns.Add("col1", "Ipaddress");
  dgv1.Columns.Add("col2", "Sysname");
  dgv1.Columns.Add("col3", "username");
  dgv1.Columns.Add("col4", "text");
  dgv1.Columns.Add("col5", "datetime");

  string line;
  StreamReader strRead = new StreamReader("D:\\login.lgl");
  {
    int row = 0;

    while ((line = strRead.ReadLine()) != null)
    {
      string[] columns = line.Split('|');
      dgv1.Rows.Add();
      for (int i = 0; i < columns.Length; i++)
      {
        dgv1[i, row].Value = columns[i];
      }
      row++;
    }
  }
}
4

2 に答える 2

1

次のように、ファイルから解析する構造のクラスを作成することをお勧めします。

public class LogFileItem
{
   public string IpAddress {get; set;}
   public string Sysname {get; set;}
   public string Username {get; set;}
   public string Text {get; set;}
   public DateTime DateTime {get; set;}

   public static List<LogFileItem> ParseLogFile(string path)
   {
     List<LogFileItem> result = new List<LogFileItem>();

     //in a real scenario, this code should have a lot more error checks
     string line;
     StreamReader strRead = new StreamReader(path);

     while ((line = strRead.ReadLine()) != null)
     {
       string[] columns = line.Split('|');

       LogFileItem item = new LogFileItem();
       item.IpAddress = columns[0];
       item.Sysname = columns[1];
       item.Username = columns[2];
       item.Text = columns[3];
       //this assumes that the dateTime column is parsable by .net
       item.DateTime = DateTime.Parse(columns[4]);

       result.add(item); 
     }
     return result;
   }

}

その後、あなたはただすることができます:

private void BtnUser_Click(object sender, EventArgs e)
{
   List<LogFileItem> logItems = LogFileItem.ParseLogFile(@"D:\login.lgl");
   dgv1.DataSource = logItems;
}

データを表示します。また、任意の方法でデータをフィルタリングできます。フィルタリングするmonth/yearペアがある場合は、次のようにすることができます。

   List<LogFileItem> logItems = LogFileItem.ParseLogFile(@"D:\login.lgl");
   var logsPerMonth = logItems.Where(li => li.DateTime.Year = year && li.DateTime.Month == month);

日時の解析はやや暗い芸術であることに注意してください。そのため、それを機能させるために見てみることができますDateTime.ParseExact。また、usingステートメントを使用するか、。を使用してテキストファイルから行を読み取ることも確認してくださいFile.ReadAllLines

于 2013-01-21T12:18:43.277 に答える
1

Linq を使用して月ごとにグループ化できます。

var logMonthGroups = File.ReadLines("D:\\login.lgl")
    .Select(l => new { Cols = l.Split('|') })
    .Select(x => new
    {
        Ipaddress = x.Cols.ElementAtOrDefault(0),
        Sysname = x.Cols.ElementAtOrDefault(1),
        username = x.Cols.ElementAtOrDefault(2),
        text = x.Cols.ElementAtOrDefault(3),
        datetime = x.Cols.ElementAtOrDefault(4) == null ? DateTime.MinValue : DateTime.Parse(x.Cols[4])
    })
    .GroupBy(x => new { Year = x.datetime.Year, Month = x.datetime.Month })
    .OrderBy(g => g.Key.Year).ThenBy(g => g.Key.Month);

foreach(var group in logMonthGroups)
{
    // add to the DataGridView ...
}
于 2013-01-21T11:59:56.017 に答える