求算法,解决即给分,在线等,急

okyzx 2006-06-20 02:00:55
//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,10

2006-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,11

2006-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
……
...全文
408 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
okyzx 2006-06-20
  • 打赏
  • 举报
回复
多谢大家~~特别是
Eddie005(♂) №.零零伍 (︶︵︶)

BlueDog 2006-06-20
  • 打赏
  • 举报
回复
用哈希表可以实现
public class IPData
{
public string IP;
public int count;
}

当有新的数据进来就进行检查,如果存在对应的节点,就将count加1 ,否则就加入一个新节点

如果IP值数量太大,就会有性能问题,不过对于192.168.XXX.XXX应该不会有问题
注意如果知道IP总数的大范围,可以一次性分配内存,这样会加快速度
JasonHeung 2006-06-20
  • 打赏
  • 举报
回复
分组行转列问题。请查询行转列关键字就可得到解决思路。
Eddie005 2006-06-20
  • 打赏
  • 举报
回复
偶也不认为有什么聪明的做法,只能通过循环填充数据到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显示
wumingbing_8027 2006-06-20
  • 打赏
  • 举报
回复
把文件按行读出来,排序!!写入文件..

呵呵
Knight94 2006-06-20
  • 打赏
  • 举报
回复
to 格式是固定的,但对于每个时间来说,所有ip并不一定都有记录。

这就比较麻烦了,那么我前面所说的就不能完全适用。

这样你的统计数据无法简单获得行和列的数目,自己做循环吧。:(
okyzx 2006-06-20
  • 打赏
  • 举报
回复
to Knight94(愚翁):
格式是固定的,但对于每个时间来说,所有ip并不一定都有记录。
能给出更具体一点的代码吗,您说的意思,我不大明白
Knight94 2006-06-20
  • 打赏
  • 举报
回复
如果你的格式是固定的话,且对于每个时间来说,所有ip都有记录,则可以如下进行处理。

1、All data => DataTable
2、获得IP列表,通过第一条记录的时间,用"DataTable.Select"获得;
3、获得统计记录条目,通过第一条记录的IP值,用"DataTable.Select"获得;
4、通过2和3,创建统计表,然后对于IP列来说分别用"DataTable.Select"方法来进行填写。
Knight94 2006-06-20
  • 打赏
  • 举报
回复
用DataTable来存放数据,自己做循环进行处理。
okyzx 2006-06-20
  • 打赏
  • 举报
回复
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我早就实现这功能了
请大家帮忙了:)
HAVENT 2006-06-20
  • 打赏
  • 举报
回复
不会聪明办法,有个费力的办法

建立一个DATETABLE,结构要跟你要的一样

然后将数据循环读取到DataTable中,实现你的统计效果

最后对DataTable按时间排序即可

至于SQL语句能否实现我就不知道了,感觉也许可以,但我对SQL没什么造诣……汗
njdxbzu 2006-06-20
  • 打赏
  • 举报
回复
用临时表实现,循环数据,然后动态生成以具体IP为名的字段,当然,如果不能用IP做字段名你就用它作为第一行的记录吧.

mysql不知道.
Knight94 2006-06-20
  • 打赏
  • 举报
回复
你这不是group by操作
okyzx 2006-06-20
  • 打赏
  • 举报
回复
补一句:同一时间加IP只会有一条记录,(即时间+IP为主键)
可以借助于数据库来实现此功能,不过只能用MYSQL 4.1.X数据库,不能用其它数据库
最好是用纯C#实现,多谢 了

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧