C语言 csv文件逐行读取写入(Linux)

发布时间:2024年01月19日
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

/*
读取csv文件  存入新的文件
*/
int read_line(int fd_data,unsigned char *data_buf){ //逐行读取,赋值给data_buf
    unsigned char c;
    int len;
    int i = 0;
    int err = 0;
    while(1){ //循环写入字符
        len = read(fd_data,&c,1);
        if(len <=0){
            err = -1;
            break;
        }
        else{
            if(c!='\n' && c != '\r'){ //判断是否碰到换行符和空格符号 没有碰到加入data_buf,碰到则退出
                data_buf[i] = c;
                i++;
            }
            else{
                err = 0;
                break;
            }
        }
    }
    data_buf[i] = '\0'; // 在结尾添加结束符

    if (err && (i == 0)){  // 没有报错但是也没有读取到值    
            return -1; //返回-1 报错 
        }
    else{
            return i;
        }
    
}

void process_data(unsigned char *data_buf,unsigned char *result_buf){ //处理数据函数 将逐行读取到的参数复制给要写入的参数

char name[50];
int score[5];
int sum = 0;
char *levels[] = {"S","A","B"}; 
int level;
    //我写的
    // for(int j = 0;j < strlen(data_buf);j++){        
    //     result_buf[j] = data_buf[j];
    //     if(data_buf[j] == '\0'){
    //         break;
           
    //     }
    // }

    //老师写的
    
    if (data_buf[0] == 0x2c){ //对于UTF-8编码的文件,它的前三个字符是0xef 0xbb 0xbf 可以使用hexdump -C data.csv 将csv文件内容以16进制展示查看第一行的开头是什么字符
        strcpy(result_buf,data_buf);   //字符串复制
        sprintf(result_buf,"%s\n",result_buf);     
    }
    else{
        sscanf(data_buf,"%[^,],%d,%d,%d,%d,%d,",name,&score[0],&score[1],&score[2],&score[3],&score[4]);//将字符串里的值赋值给变量进行操作
        sum = score[0] + score[1] + score[2] + score[3] + score[4];
        if(sum > 370){
            level = 0;
        }else if(sum > 360){
            level = 1;
        }else{
            level = 2;
        }
        sprintf(result_buf,"%s,%d,%d,%d,%d,%d,%d,%s\n",name,score[0],score[1],score[2],score[3],score[4],sum,levels[level]);
    }
    
    
}

void write_data(unsigned char *result_buf,int fd_result){ //写入函数
    unsigned char c;
    int len;
    int i = 0;
    int err = 0;

    len = write(fd_result,result_buf,strlen(result_buf)); //write函数返回写入字符数量
    if(len != strlen(result_buf)){
        perror("write");
    }
   }

int main(int argc, char **argv){ //argc是写入参数数量int型 argv为输入的参数 是个数组
    int fd_data,fd_result;
    int len,xunhuan = 0;
    unsigned char data_buf[1000];
    unsigned char result_buf[1000];

    if(argc != 3){  //判断  如果输入的参数不是3个报错
        printf("Usage: %s <file> <data csv file> <result csv file> \n",argv[0]);
        return -1;
    }

    fd_data = open(argv[1],O_RDONLY, 0644);
    
    if(fd_data <0){
        printf("can not open file %s\n",argv[1]);        
        perror("open");
        return -1;
    }
    else{
        printf("fd = %d \n",fd_data);
    }

    fd_result = open(argv[2],O_RDWR | O_CREAT | O_TRUNC, 0644); //如果要写入的csv文件不存在,新建
    if(fd_result <0){
        printf("can not create file %s\n",argv[2]);        
        perror("open");
        return -1;
    }
    else{
        printf("fd = %d \n",fd_result);
    }

    while(1){
        len = read_line(fd_data,data_buf);        
        if(len == -1){
            break;
        }
        if(len != 0){
            xunhuan++;
            process_data(data_buf,result_buf);
            printf("写入第%d行",xunhuan);
            printf("line : %s \n",result_buf);
            write_data(result_buf,fd_result);
        }
       
    }
    printf("传输完成!已经把内容从 %s 传输到 %s \n",argv[1],argv[2]); //argv['./rw_csv','<读取的csv文件> ','<要写入的csv文件>']
    close(fd_data);
    close(fd_result);
    return 0;
}

Linux终端输入(rw_csv.c为代码文件名)
gcc -o rw_csv rw_csv.c
./rw_csv <读取的csv文件> <要写入的csv文件>

文章来源:https://blog.csdn.net/weixin_43366149/article/details/135701437
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。