如何将具有相同列值的行分组为 C 中的一行?
How to group rows with the same column value into one row in C?
我正在尝试制作一个统计计算代码,其中在 column1 上给出了带有年份的文件,在 column2 上给出了类型,在 column3 上给出了计数。并找出每年每种类型的计数总和。
我坚持将列中具有相同值的数据分组到同一行中..
输入数据:
2010 101 22
2010 101 40
2010 101 44
2010 101 66
2010 102 14
2010 100 7
2010 101 2
2010 101 3
2010 101 2
2010 101 3
2011 101 23
2011 101 27
2011 101 47
2011 101 66
2011 100 5
2011 102 16
2011 101 4
2011 101 1
2011 101 3
2011 101 5
输出:
| Year | 100 | 101 | 102 |
--------------------------
| 2010 | 7 | 182 | 14 |
| 2011 | 5 | 176 | 16 |
我可以
if(year == 2010)
{}
if(year == 2011)
{}
但我的数据并不总是像给定的输入那样。有没有办法在不知道年列中有多少行和什么内容的情况下对它们进行分组?也许逐行比较?
我很困惑,请帮忙..
有了年份和类型的 fixed/limited 范围,我们可以使用固定大小的二维数组来保存计数。
这是执行此操作的一些代码:
#include <stdio.h>
#include <stdlib.h>
// year config
#define YRLO 2008
#define YRHI 2020
#define YRTOT ((YRHI - YRLO) + 1)
// type config
#define TYPLO 100
#define TYPHI 103
#define TYPTOT ((TYPHI - TYPLO) + 1)
#define RANGE(_val,_lo,_hi) \
((_val) >= (_lo)) && ((_val) <= (_hi))
int counts[YRTOT][TYPTOT];
int
main(void)
{
const char *file = "data.txt";
FILE *xfin = fopen(file,"r");
if (xfin == NULL) {
perror(file);
exit(1);
}
int yr;
int typ;
int cnt;
int lno = 0;
while (fscanf(xfin,"%d %d %d",&yr,&typ,&cnt) == 3) {
++lno;
if (! RANGE(yr,YRLO,YRHI)) {
printf("line %d -- bad year -- %d\n",lno,yr);
continue;
}
if (! RANGE(typ,TYPLO,TYPHI)) {
printf("line %d -- bad type -- %d\n",lno,typ);
continue;
}
// store data (convert absolute years and types to relative numbers)
counts[yr - YRLO][typ - TYPLO] += cnt;
}
fclose(xfin);
const char *fmt = " | %8d";
int totlen = 0;
// print the title
totlen += printf("| Year");
for (int tidx = 0; tidx < TYPTOT; ++tidx)
totlen += printf(fmt,tidx + TYPLO);
totlen += printf(" |");
printf("\n");
// print a dashed line
for (int icol = 0; icol < totlen; ++icol)
fputc('-',stdout);
printf("\n");
for (int yidx = 0; yidx < YRTOT; ++yidx) {
// A nicety: decide if year has any non-zero counts
int hasdata = 0;
for (int tidx = 0; tidx < TYPTOT; ++tidx) {
if (counts[yidx][tidx]) {
hasdata = 1;
break;
}
}
// skip any years that have no data [optional]
if (! hasdata)
continue;
// output the absolute year
printf("| %d",yidx + YRLO);
// output the counts for each type
for (int tidx = 0; tidx < TYPTOT; ++tidx)
printf(fmt,counts[yidx][tidx]);
printf(" |\n");
}
return 0;
}
这是给定输入数据的程序输出:
| Year | 100 | 101 | 102 | 103 |
----------------------------------------------------
| 2010 | 7 | 182 | 14 | 0 |
| 2011 | 5 | 176 | 16 | 0 |
我正在尝试制作一个统计计算代码,其中在 column1 上给出了带有年份的文件,在 column2 上给出了类型,在 column3 上给出了计数。并找出每年每种类型的计数总和。
我坚持将列中具有相同值的数据分组到同一行中..
输入数据:
2010 101 22
2010 101 40
2010 101 44
2010 101 66
2010 102 14
2010 100 7
2010 101 2
2010 101 3
2010 101 2
2010 101 3
2011 101 23
2011 101 27
2011 101 47
2011 101 66
2011 100 5
2011 102 16
2011 101 4
2011 101 1
2011 101 3
2011 101 5
输出:
| Year | 100 | 101 | 102 |
--------------------------
| 2010 | 7 | 182 | 14 |
| 2011 | 5 | 176 | 16 |
我可以
if(year == 2010)
{}
if(year == 2011)
{}
但我的数据并不总是像给定的输入那样。有没有办法在不知道年列中有多少行和什么内容的情况下对它们进行分组?也许逐行比较?
我很困惑,请帮忙..
有了年份和类型的 fixed/limited 范围,我们可以使用固定大小的二维数组来保存计数。
这是执行此操作的一些代码:
#include <stdio.h>
#include <stdlib.h>
// year config
#define YRLO 2008
#define YRHI 2020
#define YRTOT ((YRHI - YRLO) + 1)
// type config
#define TYPLO 100
#define TYPHI 103
#define TYPTOT ((TYPHI - TYPLO) + 1)
#define RANGE(_val,_lo,_hi) \
((_val) >= (_lo)) && ((_val) <= (_hi))
int counts[YRTOT][TYPTOT];
int
main(void)
{
const char *file = "data.txt";
FILE *xfin = fopen(file,"r");
if (xfin == NULL) {
perror(file);
exit(1);
}
int yr;
int typ;
int cnt;
int lno = 0;
while (fscanf(xfin,"%d %d %d",&yr,&typ,&cnt) == 3) {
++lno;
if (! RANGE(yr,YRLO,YRHI)) {
printf("line %d -- bad year -- %d\n",lno,yr);
continue;
}
if (! RANGE(typ,TYPLO,TYPHI)) {
printf("line %d -- bad type -- %d\n",lno,typ);
continue;
}
// store data (convert absolute years and types to relative numbers)
counts[yr - YRLO][typ - TYPLO] += cnt;
}
fclose(xfin);
const char *fmt = " | %8d";
int totlen = 0;
// print the title
totlen += printf("| Year");
for (int tidx = 0; tidx < TYPTOT; ++tidx)
totlen += printf(fmt,tidx + TYPLO);
totlen += printf(" |");
printf("\n");
// print a dashed line
for (int icol = 0; icol < totlen; ++icol)
fputc('-',stdout);
printf("\n");
for (int yidx = 0; yidx < YRTOT; ++yidx) {
// A nicety: decide if year has any non-zero counts
int hasdata = 0;
for (int tidx = 0; tidx < TYPTOT; ++tidx) {
if (counts[yidx][tidx]) {
hasdata = 1;
break;
}
}
// skip any years that have no data [optional]
if (! hasdata)
continue;
// output the absolute year
printf("| %d",yidx + YRLO);
// output the counts for each type
for (int tidx = 0; tidx < TYPTOT; ++tidx)
printf(fmt,counts[yidx][tidx]);
printf(" |\n");
}
return 0;
}
这是给定输入数据的程序输出:
| Year | 100 | 101 | 102 | 103 |
----------------------------------------------------
| 2010 | 7 | 182 | 14 | 0 |
| 2011 | 5 | 176 | 16 | 0 |