如何将具有相同列值的行分组为 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 |