//CSV文件存放如下数据
//时间,IP,CPU值
2006-06-13 16:56:39,192.168.0.7,32
2006-06-13 16:56:39,192.168.0.6,19
2006-06-13 16:56:39,192.168.0.5,102006-06-13 16:56:58,192.168.0.7,22
2006-06-13 16:56:58,192.168.0.6,99
2006-06-13 16:56:58,192.168.0.5,112006-06-13 16:57:29,192.168.0.7,34
2006-06-13 16:57:29,192.168.0.6,77
2006-06-13 16:57:29,192.168.0.5,12
……
想通过C#实现统计出如下的功能以第一列时间进行如同数据库的Group By操作,并把IP字段由选择变成投影
例子如下
Time,                192.168.0.7,192.168.0.6,192.168.0.6
2006-06-13 16:56:39 32           19          10
2006-06-13 16:56:58 22           99          11  
2006-06-13 16:57:29 34           77          12
……

解决方案 »

  1.   

    补一句:同一时间加IP只会有一条记录,(即时间+IP为主键)
    可以借助于数据库来实现此功能,不过只能用MYSQL 4.1.X数据库,不能用其它数据库
    最好是用纯C#实现,多谢 了
      

  2.   

    用临时表实现,循环数据,然后动态生成以具体IP为名的字段,当然,如果不能用IP做字段名你就用它作为第一行的记录吧.mysql不知道.
      

  3.   

    不会聪明办法,有个费力的办法建立一个DATETABLE,结构要跟你要的一样然后将数据循环读取到DataTable中,实现你的统计效果最后对DataTable按时间排序即可至于SQL语句能否实现我就不知道了,感觉也许可以,但我对SQL没什么造诣……汗
      

  4.   

    TO ALL:
    不好意思,可能刚才表达有误,就是有点类似group by的操作
    原始文件在CSV文件中,最终也是生成CSV文件
    和上面的例子一下如下:
    Time,192.168.0.7,192.168.0.6,192.168.0.6
    2006-06-13 16:56:39,32,19,10
    2006-06-13 16:56:58,22,99,11  
    2006-06-13 16:57:29,34,77,12
    最好能用C#代码来实现,用MYSQL挺麻烦的,如果是SQL SERVER我早就实现这功能了
    请大家帮忙了:)
      

  5.   

    用DataTable来存放数据,自己做循环进行处理。
      

  6.   

    如果你的格式是固定的话,且对于每个时间来说,所有ip都有记录,则可以如下进行处理。1、All data => DataTable
    2、获得IP列表,通过第一条记录的时间,用"DataTable.Select"获得;
    3、获得统计记录条目,通过第一条记录的IP值,用"DataTable.Select"获得;
    4、通过2和3,创建统计表,然后对于IP列来说分别用"DataTable.Select"方法来进行填写。
      

  7.   

    to Knight94(愚翁):
    格式是固定的,但对于每个时间来说,所有ip并不一定都有记录。
    能给出更具体一点的代码吗,您说的意思,我不大明白
      

  8.   

    to 格式是固定的,但对于每个时间来说,所有ip并不一定都有记录。这就比较麻烦了,那么我前面所说的就不能完全适用。这样你的统计数据无法简单获得行和列的数目,自己做循环吧。:(
      

  9.   

    偶也不认为有什么聪明的做法,只能通过循环填充数据到DataTable
                DataTable dt = new DataTable();
                dt.Columns.Add("time");
                dt.PrimaryKey = new DataColumn[]{dt.Columns[0]};
                
                //遍历CSV文件的每一行数据
                string curTime = "2006-06-13 16:56:39 32";
                string curIP = "192.168.0.6";
                string curPrecent = "32";            if(!dt.Columns.Contains(curIP))
                    dt.Columns.Add(curIP);            DataRow curRow = dt.Rows.Find(curTime);
                if(curRow == null) 
                {
                    curRow = dt.NewRow();
                    dt.Rows.Add(curRow);
                }
                curRow[curIP] = curPrecent;            //ok,完成,绑定到DataGrid显示
      

  10.   

    用哈希表可以实现
    public class IPData
    {
        public string IP;
        public int count;
    }当有新的数据进来就进行检查,如果存在对应的节点,就将count加1 ,否则就加入一个新节点如果IP值数量太大,就会有性能问题,不过对于192.168.XXX.XXX应该不会有问题
    注意如果知道IP总数的大范围,可以一次性分配内存,这样会加快速度
      

  11.   

    多谢大家~~特别是
     Eddie005(♂) №.零零伍 (︶︵︶)