格式化.csv文件以打印表格(C)

时间:2018-11-25 13:29:02

标签: c

我必须打印csv文件的格式表。我想知道您是否知道任何特定的库或工具可以帮助我解决此问题-我只是通过谷歌搜索找不到任何东西。

这是代码,代码工作正常,只需要像格式化表格一样打印即可。谢谢!

void opportunity_table()
{
int i = 3;
char line[LINESIZE];
FILE* fp = fopen("opportunity_table.csv", "r");
if (!fp) {
    printf("File failed to open!\n");
    exit(1);
}
while (fgets(line, LINESIZE, fp)) {
    while (line[i] != '\n') {
        if (line[i] == ',') {
            printf("%s  ", "");
        }               
        else
            printf("%c", line[i]);
        i++;
    }
    i = 0;
    puts(" ");
}
}

我从运行这段代码中获得的输入是混乱的,看起来真的很糟糕。

1 个答案:

答案 0 :(得分:3)

利用%s说明符的width和precision字段。宽度字段设置至少指定字符的宽度。精度字段最多可以打印指定数量的字符。只要宽度大于精度即可工作。
strpbrk将给出一个指向字符串中下一个字符或NULL的指针。
格式字符串"%*.*s"将使打印正确。使用"%-*.*s"左对齐。

#include <stdio.h>
#include <string.h>

#define WIDTH 7

int main( void) {
    char csv[] = "a,b,cde,fghij,i,jh\n";
    char *item = csv;
    char *comma = NULL;
    while ( *item && ( comma = strpbrk ( item, ",\n"))) {//pointer to each comma and the newline
        printf ( "%*.*s", WIDTH, comma - item, item);
        item = comma + 1;//skip the comma or newline
    }
    printf ( "\n");
    return 0;
}

如果字段的宽度需要变化,则可以使用宽度数组。

#include <stdio.h>
#include <string.h>

int main( void) {
    char csv[4][50] = {
        "a,b,cde,fghij,i,jh\n",
        "i,jk,lmno,pq,rst,uvw\n",
        "0,1,2,3456,78,9\n",
        "x,y,z,01,2345,6789\n"
    };
    char *item = NULL;
    char *comma = NULL;
    int width[] = { 3, 4, 6, 7, 6, 5};
    int field = 0;
    for ( int loop = 0; loop < 4; ++loop) {
        field = 0;
        item = csv[loop];
        while ( *item && ( comma = strpbrk ( item, ",\n"))) {//pointer to each comma and the newline
            printf ( "%*.*s", width[field], comma - item, item);
            item = comma + 1;//skip the comma or newline
            field++;
        }
        printf ( "\n");
    }
    return 0;
}

可以通过两次读取文件来自定义。字段数和最大宽度可以在第一次读取时确定。第二次读取文件并使用计算出的宽度进行打印。