C语言中生成CSV文件的代码维护

vohkndzv  于 2022-12-20  发布在  其他
关注(0)|答案(2)|浏览(138)

我正在寻找一种更简单的方法来维护生成CSV文件的代码。
目前,CSV文件中的每一行都是按以下方式写入的:

fprintf(pCsvFile,"%s,%s,%d,%d,%d",param->a, param->b, param->c, param->d, param->e);

实际上,我在CSV文件的每一行中写入了大约20个不同类型的不同值,正如您所猜到的,维护代码(添加或删除参数)开始变得非常困难。
有什么聪明的方法用C语言来做吗?谢谢。

xmq68pz9

xmq68pz91#

这看起来像是tagged union的一个作业。下面是一个如何写入更多动态记录的示例。

#include <limits.h>
#include <stdio.h>

#define FIELD_COUNT 20

enum Kind {
    String,
    Int,
    Float,
};

union Value {
    const char* s;
    int         i;
    float       f;
};

struct Tagged_Union {
    enum Kind kind;
    union Value value;
};

void print_field(struct Tagged_Union tg)
{
    switch (tg.kind) {
    case String:
        // to keep with the RFC4180 "standard," this is 
        // incorrect, but may not matter for your use case.
        printf("%s", tg.value.s);
        break;
    case Int:
        printf("%d", tg.value.i);
        break;
    case Float:
        printf("%f", tg.value.f);
    }
}

int main()
{
    struct Tagged_Union tg[FIELD_COUNT];

    // fill in your data

    int i = 0;
    for (; i < FIELD_COUNT; ++i) {
        if (!i) {
            printf(",");
        }
        print_field(tg[i]);
    }
    printf("\n");
}

这将只打印一条记录,但我希望您可以看到如何将其应用于您的用例。

iszxjhcz

iszxjhcz2#

每个值都可以通过单独调用fprintf()来写入。除非您确定字符串元素不需要特殊处理(参见https://www.rfc-editor.org/rfc/rfc4180),否则您应该实现一个函数(下面称为fprintfCsvString())来正确处理字符串元素,即如果需要,用双引号括起来,并转义双引号字符。
编写每一个CSV行可能如下所示:

fprintfCsvString(pCsvFile, param->a); fprintf(pCsvFile, ",");
  fprintfCsvString(pCsvFile, param->b); fprintf(pCsvFile, ",");
  fprintf(pCsvFile, "%d", param->c); fprintf(pCsvFile, ",");
  fprintf(pCsvFile, "%d", param->d); fprintf(pCsvFile, ",");
  fprintf(pCsvFile, "%d", param->e); fprintf(pCsvFile, "\r\n");  // End of line

(the fprintfCsvString()的实施不在本问题/答案的范围内)

相关问题