C语言读取CSV文件的方法1

1、字符串处理中的 strtok() 函数


我们首先来介绍C语言标准库中的一个非常有用的字符串处理函数 strtok(),该函数位于头文件string.h中,它的原型是:

char *strtok( char *s, const char *ct );

它以 ct 中的字符为分界符,将字符串 s 分成许多记号。第一次调用时,它搜索 s ,找到不包含ct的第一个记号,将 s 中的下一个字符替换为 ‘/0’ ,并返回指向记号的指针。随后调用 strtok 函数时(由 s 的值是否为NULL指示),返回下一个不包含 ct 中字符的记号。当 s 中没有这样的记号时,返回NULL 。每次调用时的 ct 可以不同。

下面这段代码演示了这个函数的使用(假设以逗号为分隔符):

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

int main(int argc, const char * argv[]) {
    
    
    char str[] = "The United States of America,New Zealand,Australia,Republic of Korea";
    char delims[] = ",";
    char *result = NULL;
    result = strtok( str, delims );
    while( result != NULL ) {
        printf("%s\n", result);
        result = strtok( NULL, delims );
    }
    
    return 0;
}

执行上述代码,输出结果如下:

The United States of America
New Zealand
Australia
Republic of Korea


逗号分隔值文件格式(CSV,Comma-Separated Values),有时也称为字符分隔值,因为分隔字符也可以不是逗号,是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。


下面我们就利用strtok()来读取一下CSV文件中的内容,作为例子考虑下面这个简单的CSV文件:


编码时可能需要注意的地方主要有两点:1)传统上,C语言中没有像getline()那样一行一行读文件的函数,所以我们需要使用fgets()来替代(但最新版本的C语言中已经引入了一个getline()函数,我们会在后面的文章中再介绍它);2)CSV文件的每行会用一个'\n'来结束,读取一行内容时,应该设法把这个回车符去掉。

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

#define MAX_LINE_SIZE 20

int main(int argc, const char * argv[]) {
    
    char file_name[] = "test_data.csv";
    FILE *fp;
    fp = fopen(file_name, "r");
    
    if (!fp) {
        fprintf(stderr, "failed to open file for reading\n");
        return 1;
    }
    
    char line[MAX_LINE_SIZE];
    char *result = NULL;
    
    while(fgets(line, MAX_LINE_SIZE, fp) != NULL) {
        
        result = strtok(line, ",");
        int i = 0;
        while( result != NULL ) {
            if(i!=0){
                printf("%d\t", atoi(result));
            }
            else{
                printf("%s\t", result);
                i++;
            }
            result = strtok(NULL, ",");
        }
        printf("\n");
    }
    
    fclose (fp);
    
    return 0;
}

执行上述代码,输出结果如下:

James	85	67	34	
Thomas	27	82	100	
Jason	1	23	98	
Charls	35	62	78	


(本文完)





已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值