C语言读取写入CSV文件 [一]基础篇
本系列文章目录
什么是CSV?
CSV 是一种以纯文本形式存储的表格数据,具体介绍如下(来自维基百科):
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
简单的说,CSV 是一种通用的、相对简单的表格文件格式,最广泛的应用就是在不同程序之间转移表格数据。值得注意的是,CSV 并没有一种单一的、定义明确的格式(虽然有一个 RFC 4180 的标准),一般地,CSV 文件具有如下特征:
- 纯文本,使用某个特定的字符集保存,例如 ASCII、Unicode 等
- 由一条条记录组成,一般每一行代表一条记录
- 每条记录被分隔符划分为不同的字段,最常见的分隔符是逗号,毕竟其中文名叫逗号分隔值:)
- 每条记录相同的字段序列
因为CSV 并没有一种单一的、定义明确的格式,因此下面的内容以最常见的格式为例,即逗号(,)分隔字段,换行符(\n)分隔记录。
C 语言写入 CSV 文件
首先我们来了解如何写入一个 CSV 文件,下面是示例代码:
// 1-1.c
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp = fopen("tmp.csv", "w+");
if (fp == NULL) {
fprintf(stderr, "fopen() failed.\n");
exit(EXIT_FAILURE);
}
fprintf(fp, "ID,Name,Points\n");
fprintf(fp, "1,qwe,1.1\n");
int id = 2;
char *name = "asd";
float point = 2.2;
fprintf(fp, "%d,%s,%f\n", id, name, point);
fclose(fp);
return 0;
}
上述代码中,首先便是打开一个 CSV 文件,若打开失败,那么则报告出错结束程序。接下来便是向打开的 CSV 文件写入内容:
fprintf(fp, "ID,Name,Points\n");
常见的CSV文件的分隔符是逗号(,),被分隔符分开的字段会位于不同的列。在上述语句中,ID
、Name
、Points
被分隔符分开,因此这个CSV文件共有3列,分别是ID
、Name
、Points
。
CSV文件是由一条条记录组成的,常见划分不同记录的符号是换行符(\n)。在上述语句中,ID
、Name
、Points
分别属于同一行上的不同三列,很显然,这条记录是表头。
接下来的 fprintf(fp, "1,qwe,1.1\n");
语句写入的记录为 1、qwe、1.1,分为三列,正好对应于 ID=1、Name=qwe、Points=1.1。前一条语句采用了直接写入,但很多时候我们的值是变化的,幸运的是,CSV的写入同样支持格式化写入,代码如下:
int id = 2;
char *name = "asd";
float point = 2.2;
fprintf(fp, "%d,%s,%f\n", id, name, point);
最后写入的记录为 2(ID)、asd(Name)、2.2(Points)。运行程序,查看 CSV 文件内容,结果为:
C 语言读取 CSV 文件
示例程序如下:
// 1-2.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *fp = fopen("tmp.csv", "r");
if (fp == NULL) {
fprintf(stderr, "fopen() failed.\n");
exit(EXIT_FAILURE);
}
char row[80];
char *token;
while (fgets(row, 80, fp) != NULL) {
printf("Row: %s", row);
token = strtok(row, ",");
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, ",");
}
}
fclose(fp);
return 0;
}
首先要打开将要读取的CSV文件,这一步和写入一样,不再赘述。
while (fgets(row, 80, fp) != NULL) {
printf("Row: %s", row);
// other code
}
因为CSV文件是一个纯文本文件,因此我们可以使用 fgets
函数一行一行地进行读取,这样读取得到的便是CSV文件中一条条记录。接下来要做的就是将不同字段从记录中分隔出来:
token = strtok(row, ",");
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, ",");
}
char* strtok(char *restrict str, const char *restrict delim)
函数可以把字符串 str
按照给定的分隔符 delim
进行分隔,如果要解析仍是之前同一个字符串时,需要把 str
设为 NULL
。因此 token = strtok(row, ",");
这条语句会尝试用逗号(,)来分割刚刚读取得到的记录,同时使用一个 while (token != NULL)
循环来不断进行分割,直到无法分隔为止,这样就得到每个字段的值。
程序运行输出的结果如下:
$ clang 1-2.c -o 1-2
$ ./1-2
Row: ID,Name,Points
Token: ID
Token: Name
Token: Points
Row: 1,qwe,1.1
Token: 1
Token: qwe
Token: 1.1
Row: 2,asd,2.200000
Token: 2
Token: asd
Token: 2.200000
最后总结一下,CSV 文件和普通文件一样,无论读写都需要先打开文件。而后写入或读取时所用的函数和普通文件没有区别,唯一需要注意的是,CSV 文件通过特定的分隔符来区分字段和记录:
- 用换行符(\n)来区分记录,一条记录会占据CSV文件的一行
- 用逗号(,)来区分一条记录中的不同字段,每个字段会单独占据一列
如果想要了解进阶的 C 语言读写 CSV 文件的有关内容,欢迎接着阅读进阶篇:
C语言读取写入CSV文件 [一]基础篇的更多相关文章
- 009-Go 读取写入CSV文件
package main import( "encoding/csv" "fmt" "os" "strconv" ) t ...
- pandas 读写excel 操作(按索引和关键字读取行和列,写入csv文件)
pandas读写excel和csv操作总结 按索引读取某一列的值 按关键字读取某一列的值 按关键字查询某一行的值 保存成字典并写入新的csv import pandas as pd grades=pd ...
- python读取和写入csv文件
读取csv文件: def readCsv(): rows=[] with file(r'E:\py\py01\Data\system.csv','rb') as f: reads=csv.reader ...
- python之读取和写入csv文件
写入csv文件源码: #输出数据写入CSV文件 import csv data = [ ("Mike", "male", 24), ("Lee&quo ...
- python在不同情况下写入csv文件
情况一(解法一):将列表存储为csv文件.列表的每一项代表csv文件的一行. 列表中的每一项包含多个属性.list=[[属性1,属性2,属性3,……],[属性1,属性2,属性3,……],[属性1,属性 ...
- 写入.csv文件
#include "stdafx.h" #include "WriteCsv.h" CString m_strData;//写入记录的一条数据 CString ...
- 读取gzmt.csv文件,计算均值及概率
问题: 读取gzmt.csv文件所有数据,选取收盘价格(倒数第二列),计算20天均值,权重取成交量(选做:时间权重为半衰期为15天):将该均值修剪为超过600的都设置为1000,并打印出该均值超过55 ...
- 利用Python写入CSV文件的方法
第一种:CSV写入中文 #! /usr/bin/env python # _*_ coding:utf- _*_ import csv csvfile = file('test.csv', 'wb') ...
- python3写入csv文件时中文为乱码
今天修改李万的爬虫时把页面上的中文写入csv文件时,中文总是乱码.通过上网搜索得到解决.解决的办法是打开文件是需加参数 encoding='utf-8-sig' .感谢博客园的菜鸟Alex.他相关博客 ...
随机推荐
- 【LeetCode】714. Best Time to Buy and Sell Stock with Transaction Fee 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...
- anaconda 如何更换镜像源
今天需要对anaconda更换其镜像源. 故而做一个小记: 一 查看anaconda的本源方法 电脑路径:C:\Users\14269,找到 .condarc 文件. 打开.condarc文件,可看 ...
- 数据结构作业——P53页算法设计题(7):原地逆转链表
一. 题目描述: 设计一个算法,将链表中所有结点的链接方向"原地"逆转,即要求仅利用原表的存储空间,换句话说,要求算法的空间复杂度为O(1). 二.算法设计 #include< ...
- 第48篇-native方法调用解释执行的Java方法
举一个native方法调用解释执行的Java方法的实例,如下: public class TestJNI { static { System.load("/media/mazhi/sourc ...
- JavaScript交互式网页设计 • 【第1章 JavaScript 基本语法】
全部章节 >>>> 本章目录 1.1 JavaScript 概述 1.1.1 JavaScript 简介 1.1.2 JavaScript 的概念和执行原理 1.1.3 J ...
- MySQL数据操作与查询笔记 • 【第7章 连接查询】
全部章节 >>>> 本章目录 7.1 内连接查询 7.1.1 交叉连接(笛卡尔积) 7.1.2 内连接查询概要 7.1.3 内连接案例 7.1.4 自然连接 7.2 多表连 ...
- Kinaba及X-Pack插件安装
Kibana可视化管理平台安装,以及Kibana安装X-Pack插件: 基于已经安装好的6.2.2版本的Elasticsearch,安装6.2.2版本的Kibana. 基于已经安装好的6.2.2版本的 ...
- .net core中的Options重新加载机制
Options是.net core提出的一种辅助配置机制,即选项. 目前,我们可以使用的Options有五种(源码): IOptionsFactory<>:Options的创建工厂(Sin ...
- 学习git&github
详细学习视频: 链接:https://pan.baidu.com/s/1Vub3YTo7uUUuGCJUCabBRQ 提取码:6q9x 一.git基本工作流程 我们先来理解下Git 工作区.暂存区和版 ...
- Django_通用视图(五)
参考官网的投票系统,按照综合案例的流程创建应用polls,主要模块代码如下: test1/polls/models.py import datetime from django.db import m ...