`
datamachine
  • 浏览: 156749 次
社区版块
存档分类
最新评论

文本文件的分组间插入汇总值

阅读更多

         在已经分组的数据间插入汇总值,通常的做法是依次读入本组数据,直到数据发生变化,然后将本组数据和汇总值追加到新文件中,再读入下一组数据。硬编码的过程有些麻烦,集算器支持分组游标,可以自动读入整组数据。下面通过例子来看一下具体作法。

 

         日志webdata.log有三列,列之间以逗号分隔,第一列是分组标志,后两列是数值,部分数据如下:



    注意:第一组和第四组的分组标志相同。

    现在要在每组数据之间插入第二列的平均值,以及一个空行,如下:



    集算器代码:



 

          A1=file("E: \\webdata.log").cursor(;",")

这句代码以游标的方式打开日志文件。函数cursor表示根据文件对象返回游标对象,使用逗号作为列分隔符(默认分隔符是tab),默认列名是_1,_2…_n,其中列_1是分组列。也可以指定列名,比如cursor(groupName,data1,data2;”,”)

这句代码只是建立游标对象,并没有读入数据,实际的读入动作会在遇到语句for或函数fetch时触发。

 

B1=file("e:\\result.txt"),这句代码建立了一个文件对象,用来存储计算结果。

 

A2:for A1;_1

这句代码对游标A1进行循环读数,每次读入第一列(列名为_1)相同的一组数据,此时数据才会真正读入内存。

注意这里的for 语句。集算器有for cs,n这样的写法,这表示每次读入游标cs中的n条记录。而for cs;x表示每次读入游标cs中的一组记录,每组记录的x字段相同,数据需要按照x事先分组。本案例的数据已经分过组了,如果尚未分组,可以使用集算器的其他函数进行前期处理(比如游标排序函数sortx)。

语句for cs;x中的x也可以是表达式,即:每次读入多条数据,直到表达式x发生变化,比如:for A14 ;left(_1,4)。这句代码会判断第一列的前四个字符,只要前四个字符未发生变化,集算器就会把它归为一组。

B2-B4:这是for语句A2的循环体,用来对每组数据进行同样的数据处理。可以看到,for语句的作用范围用缩进就可以表示,而无需用括号或begin/end等标记。另外,循环变量用for所在单元格的格名就可以表示,即A2表示当前组对应的所有记录。如果用调试模式观察第一次循环,可以看到A2的值如下:



    B2=B1.export@a(A2;",")

这句代码将A2追加到文件中。函数export可以将一组记录输出到文件中,选项@a表示追加。为了和源数据保持一致,这里使用逗号做分割符(默认分割符是tab)。如果在第一次循环时打开result.txt,可以看到如下数据:



    B3=A2._1+"_avg,"+string(A2.avg(_2))+”\r\n”

       这句代码用来拼凑汇总字符串。A2._1表示当前组的第一列,对于第一组,这个值是“webcat_service”。表达式A2.avg(_2)表示对当前组的第二列求平均,对于第一组,这个值是2.25。函数string可以将浮点等类型的变量格式化为字符串。

         对于第一组,B3的值如下:



     
B4=B1.write@a(B3)

         这句代码可以将B3追加到结果文件中。函数exportwrite都可以写文件,但export用来写入结构化数据,而write用来写入字符串或字符串数组。选项@a表示追加,追加前会先写入回车换行。

         上述脚本已经完成了全部的数据处理过程,打开result.txt可以看到最终计算结果:



 

 

  • 大小: 48 KB
  • 大小: 58.6 KB
  • 大小: 26.3 KB
  • 大小: 14.8 KB
  • 大小: 12.3 KB
  • 大小: 3.8 KB
  • 大小: 59.3 KB
0
5
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics