📜  C中CSV文件的关系数据库(1)

📅  最后修改于: 2023-12-03 15:14:24.784000             🧑  作者: Mango

C中CSV文件的关系数据库

在C语言中,CSV文件作为一种常见的数据格式,被广泛应用于数据存储和交换。CSV(Comma-Separated Values)文件是一种文本格式的表格,每行代表一条记录,每列之间用逗号分隔,每个字段值可以用双引号括起来。

在本文中,我们将介绍如何在C语言中处理CSV文件作为关系数据库,实现CRUD(Create、Read、Update和Delete)操作。我们将使用标准库函数和第三方库来处理CSV文件。

读取CSV文件

CSV文件可以使用标准库函数fopen()和fread()来读取,也可以使用第三方库,如libcsv和libxlsxwriter。

使用标准库函数读取CSV文件

以下是使用标准库函数fopen()和fgets()读取CSV文件的示例代码:

#include <stdio.h>

int main() {
    FILE *fp = fopen("data.csv", "r");
    if (fp == NULL) {
        printf("Error: failed to open file.\n");
        return 1;
    }
    char buffer[1024];
    while (fgets(buffer, 1024, fp) != NULL) {
        printf("%s", buffer);
    }
    fclose(fp);
    return 0;
}

在上述代码中,我们使用fopen()函数打开名为"data.csv"的CSV文件,并使用fgets()函数逐行读取CSV文件中的记录。每次读取的行被存储在一个缓冲区中,最大长度为1024个字符。最后,我们使用fclose()函数关闭文件。

使用libcsv读取CSV文件

libcsv是一个轻量级的开源库,专门用于读取和解析CSV文件。以下是使用libcsv读取CSV文件的示例代码:

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

void print_data(void *s, size_t len, void *data) {
    char *str = (char *) malloc(len + 1);
    memcpy(str, s, len);
    str[len] = '\0';
    printf("%s, ", str);
    free(str);
}

int main() {
    FILE *fp = fopen("data.csv", "r");
    if (fp == NULL) {
        printf("Error: failed to open file.\n");
        return 1;
    }
    char buffer[1024];
    char *ptr;
    csv_parser parser;
    csv_init(&parser, 0);
    while (fgets(buffer, 1024, fp) != NULL) {
        ptr = buffer;
        while (csv_parse(&parser, ptr, strlen(ptr), print_data, NULL) == CSV_STATUS_OK);
        csv_fini(&parser, print_data, NULL);
        csv_free(&parser);
    }
    fclose(fp);
    return 0;
}

在上述代码中,我们使用csv_init()函数初始化一个csv_parser对象,用于解析CSV文件中的记录。csv_parse()函数被调用来解析文件中的每行记录,并将每个字段值传递给print_data()函数进行输出。最后,我们使用csv_fini()和csv_free()函数关闭解析器和释放内存。

写入CSV文件

CSV文件可以使用标准库函数fopen()和fprintf()来写入,也可以使用第三方库,如libcsv和libxlsxwriter。

使用标准库函数写入CSV文件

以下是使用标准库函数fopen()和fprintf()写入CSV文件的示例代码:

#include <stdio.h>

int main() {
    FILE *fp = fopen("data.csv", "w");
    if (fp == NULL) {
        printf("Error: failed to create file.\n");
        return 1;
    }
    fprintf(fp, "name,age\n");
    fprintf(fp, "John Doe,25\n");
    fprintf(fp, "Jane Smith,30\n");
    fclose(fp);
    return 0;
}

在上述代码中,我们使用fopen()函数创建名为"data.csv"的CSV文件,并使用fprintf()函数将表头和数据写入文件。最后,我们使用fclose()函数关闭文件。

使用libcsv写入CSV文件

libcsv也可以用来写入CSV文件,以下是示例代码:

#include <stdio.h>
#include "csv.h"

int main() {
    FILE *fp = fopen("data.csv", "w");
    if (fp == NULL) {
        printf("Error: failed to create file.\n");
        return 1;
    }
    csv_file output;
    csv_init_file(&output, fp);
    csv_write(&output, "name");
    csv_write(&output, "age");
    csv_end_record(&output);
    csv_write(&output, "John Doe");
    csv_write(&output, "25");
    csv_end_record(&output);
    csv_write(&output, "Jane Smith");
    csv_write(&output, "30");
    csv_end_record(&output);
    csv_free(&output);
    fclose(fp);
    return 0;
}

在上述代码中,我们使用csv_init_file()函数初始化一个csv_file对象,用于写入CSV文件中的记录。csv_write()函数被调用来写入CSV文件中每行记录的每个字段值,csv_end_record()函数被调用来结束记录并转到下一行。最后,我们使用csv_free()函数关闭csv_file对象并释放内存。

更新CSV文件

要更新CSV文件,您需要读取CSV文件并更新记录,最后将更新后的结果写回到CSV文件。

以下是一个更新CSV文件的示例代码:

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

int main() {
    FILE *fp = fopen("data.csv", "r+");
    if (fp == NULL) {
        printf("Error: failed to open file.\n");
        return 1;
    }
    char buffer[1024];
    char *ptr;
    long offset = 0;
    while (fgets(buffer, 1024, fp) != NULL) {
        ptr = strstr(buffer, "John Doe");
        if (ptr != NULL) {
            ptr = strchr(ptr, ',');
            ptr++;
            ptr = strchr(ptr, ',');
            ptr++;
            fseek(fp, offset + (ptr - buffer), SEEK_SET);
            fputs("26\n", fp);
            break;
        }
        offset = ftell(fp);
    }
    fclose(fp);
    return 0;
}

在上述代码中,我们使用fopen()函数打开名为"data.csv"的CSV文件,并使用fgets()函数逐行读取CSV文件中的记录。在读取每一行时,我们使用strstr()函数搜索字段"name"中的特定值"John Doe"。如果找到了这个值,我们将使用strchr()函数找到与该记录相关的字段"age",并使用fseek()函数将文件指针移动到age字段的位置。然后,我们使用fputs()函数将更新后的值"26"写入CSV文件中的记录。最后,我们使用fclose()函数关闭文件。

删除CSV文件

要删除CSV文件,您可以使用标准库函数remove()。

以下是删除CSV文件的示例代码:

#include <stdio.h>

int main() {
    if (remove("data.csv") == 0) {
        printf("File deleted successfully.\n");
    } else {
        printf("Error: failed to delete file.\n");
    }
    return 0;
}

在上述代码中,我们使用remove()函数删除名为"data.csv"的CSV文件,如果文件删除成功,将输出提示信息,否则将输出错误信息。

结论

在本文中,我们介绍了如何在C语言中处理CSV文件作为关系数据库,并实现CRUD操作。我们使用了标准库函数和第三方库来读取、写入、更新和删除CSV文件。我们希望这篇文章可以帮助您更好地了解CSV文件和C语言中的文件操作。