C语言读取写入CSV文件 [二]进阶篇——写入CSV文件

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

本系列文章目录

[一] 基础篇

[二] 进阶篇——写入CSV

[三] 进阶篇——读取CSV


什么是 包裹(使用双引号)?

包裹的概念是面向字段的,包裹起来的字段将会被视为一个整体。尤其当字段中包含一些特殊符号(如逗号、换行符、双引号)时,如果不将这些字段包裹起来,则很有可能导致 CSV 文件解析发生错误。那么我们该如何包裹一个字段呢,通常将一个字段放置在双引号("")之间,例如"ID",ID就是一个被包裹的字段。任何字段都可以使用双引号("")将其包裹起来,并不存在任何限制。

字段中特殊符号的处理

根据上面的介绍,如果一个字段中包含特殊符号,那么在写入时必须使用双引号来包裹这个字段。有一点需要注意,C语言中字符串中的双引号需要通过使用转义符号来表示(")

下面分别用逗号、换行符、双引号来做示例

  • 逗号fprintf(fp, "3,\"z,xc\",3.3\n");
  • 换行符fprintf(fp, "4,\"qw\nas\",4.4\n");
  • 双引号fprintf(fp, "5,\"\"aszx\"\",5.5\n");,第一个用作包裹字段,第二个双引号才是实际的双引号。

完整的程序如下:

// 2-1.c
#include 
#include 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);// special symbolsfprintf(fp, "3,\"z,xc\",3.3\n");fprintf(fp, "4,\"qw\nas\",4.4\n");fprintf(fp, "5,\"\"aszx\"\",5.5\n");fclose(fp);return 0;
}

运行程序,查看 CSV 文件内容,结果为:

Figure. 1

字段开头和结尾处的空格和制表符

CSV 文件中的字段中的开头和结尾上,可能会存在空格或制表符,但是该如何处理呢?按照 RFC 4180 标准的规定,“空格被看作字段的一部分,不应当被忽略”。但是RFC 4180 并不是强制标准,因此某些实现中,空格和制表符会被截断掉。因此 fprintf(fp, " 6,abc,6.6 \n"); 写入的字段可能是 6,abc,6.6(按照 RFC 4180 标准) 或者是 6,abc,6.6(空格被截掉)

然而,在 RFC 4180 标准中,并未说明空格字符若出现在被包裹的值之外如何处理,例如在 fprintf(fp, " \"7\",def,\"7.7\" \n"); 语句中,如字段\"7\",虽然7被包裹,但包裹之外的又有空格,因此目前标准中对这样的空格该如何处理还没有规定,可以保留也可以截掉。\"7.7\" 字段也面临着同样的问题。

想要将这种空格视为字段中有意义的数据,最省事的方法是将这些空格也包裹起来,例如 fprintf(fp, "\" 8\",ghi,\"8.8 \"\n"); 语句中的 "\" 8\"\"8.8 \"字段中,属于字段的空格已被包裹。

完整的程序如下:

// 2-2.c
#include 
#include 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);// special symbolsfprintf(fp, "3,\"z,xc\",3.3\n");fprintf(fp, "4,\"qw\nas\",4.4\n");fprintf(fp, "5,\"\"aszx\"\",5.5\n");// leading or trailing spacesfprintf(fp, " 6,abc,6.6 \n");fprintf(fp, " \"7\",def,\"7.7\" \n");fprintf(fp, "\" 8\",ghi,\"8.8 \"\n");fclose(fp);return 0;
}

运行程序,查看 CSV 文件内容,结果为:

Figure. 2

分隔符可能存在的问题

在某些国家(如德国、荷兰)中,小数点不是点而是逗号,因此如果依然用逗号作分隔符,那么将无法正确表示。那么该在保证小数点是逗号前提下,如何避免CSV文件解析错误,存在两种解决方法:

  1. 将所有包含小数点的数字包裹起来
  2. 使用分号而不是逗号作为分隔符

利用软件进行配置

无论是开头或结尾处的空格或制表符,还是分隔符的选择,在一些功能强大的软件中,这些其实都可以进行配置,下图分别展示了在 Microsoft Excel、LibreOffice Calc中如何解析CSV文件的配置界面。

Figure. 3

Figure. 4


如果想要了解偏基础的 C 语言读取写入 CSV 文件的内容,欢迎阅读:[一] 基础篇

如果想要了解进阶的 C 语言读取 CSV 文件的内容,欢迎阅读:[三] 进阶篇——读取CSV

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S中部署apisix(非ingress)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 不使用pvc的方式在K8S中部署apisix-gateway 简介 因为公司项目准备重构,现在做技术储备,之前公司项…

机器学习理论知识部分--偏差方差平衡(bias-variance tradeoff)

摘要: 1.常见问题 1.1 什么是偏差与方差? 1.2 为什么会产生过拟合,有哪些方法可以预防或克服过拟合? 2.模型选择例子 3.特征选择例子 4.特征工程与数据预处理例子 内容: 1.常见问题 1.1 什么是偏差与方差? …

有手就行3——持续集成环境—maven、tomcat、安装和配置

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 有手就行3——持续集成环境—maven、tomcat、安装 持续集成环境**(5)-Maven****安装和配置** 持续集成环境(6)-Tomcat安装…

.netcore基础知识(一)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 先来说说web服务器 先来一张图 一个典型的进程外托管模型 我们先看kestrel这一部分 我们在它前面放了一个方向代理服务器n…

BZOJ 1791 岛屿(环套树+单调队列DP)

题目实际上是求环套树森林中每个环套树的直径。 对于环套树的直径,可以先找到这个环套树上面的环。然后把环上的每一点都到达的外向树上的最远距离作为这个点的权值。 那么直径一定就是从环上的某个点开始,某个点结束的。 把环拆成链,定义dp[…

什么是SAS

什么是SAS?简单的说,SAS是一种磁盘连接技术。它综合了现有并行SCSI和串行连接技术(光纤通道、SSA、IEEE1394及InfiniBand等)的优势,以串行通讯为协议基础架构,采用SCSI-3扩展指令集并兼容SATA设备&#xff…

hdu区域赛在线热身赛 暨 第十二场组队赛

题目编号:hdu 4257~4266 (对应比赛题号1001~1010) 这是我们第十二场组队赛,在今天中午进行。 比赛刚开始,依然是由我的队友读题。还没看几题,就发现了好多题judge时长高达20秒,这真的有点给我们心理造成压力。不过&…

powerdesign相关

1.安装程序和汉化放百度云了 2.打印错误处理 http://jingyan.baidu.com/article/c45ad29cd84e4b051753e2c3.html 3.导出sql http://jingyan.baidu.com/article/7082dc1c48960ee40a89bd38.html 4.name和comment同步 http://blog.csdn.net/steveguoshao/article/details/16940347…

Spring系列15:Environment抽象

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 本文内容 Environment抽象的2个重要概念Profile 的使用PropertySource 的使用 Environment抽象的2个重要概念 Environme…

私有化轻量级持续集成部署方案--05-持续部署服务-Drone(上)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 提示:本系列笔记全部存在于 Github, 可以直接在 Github 查看全部笔记 持续部署概述 持续部署是能…

PS图像菜单下计算命令

PS图像菜单下计算命令通过通道的混合模式得到的选区非常精细,从而调色的时候过度非常好。功能十分强大。 下面用计算命令中的"相加"和"减去"模式做实例解析,这里通道混合模式和图层混合模式原理是一样的。 原图: 实例目…

win10 VScode配置GCC(MinGW)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 前提 安装 Visual Studio Code安装 C/C 扩展 for VS Code 也可以在vscode的extension界面搜索’c’查找插件安装 3. 获取最…

复制构造函数的用法及出现迷途指针问题

复制构造函数利用下面这行语句来复制一个对象: A (A &a) 从上面这句话可以看出,所有的复制构造函数均只有一个参数,及对同一个类的对象的引用 比如说我们有一个类A,定义如下: ?12345678910class A{public:A(int i…

Linux下压缩某个文件夹(文件夹打包)

为什么80%的码农都做不了架构师?>>> tar -zcvf /home/xahot.tar.gz /xahot tar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件。 zip 压缩方法: 压缩当前的文件夹 zi…

GoJS 使用笔记

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 作为商业软件,GoJs很容易使用,文档也很完备,不过项目中没有时间系统地按照文档学习&…

Android学习笔记:TabHost 和 FragmentTabHost

2019独角兽企业重金招聘Python工程师标准>>> Android学习笔记:TabHost 和 FragmentTabHostTabHost命名空间:android.widget.TabHost初始化函数(必须在addTab之前调用):setup(); 包含两个子元素:…

PostgreSQL VACUUM 之深入浅出 (二)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 AUTOVACUUM AUTOVACUUM 简介 PostgreSQL 提供了 AUTOVACUUM 的机制。 autovacuum 不仅会自动进行 VACUUM,也…

分布式概念与协议

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 分布式协议 分布式理论概念 1. 分布式数据一致性 分布式数据一致性,指的是数据在多个副本中存储时&#xff…

java Web监听器导图详解

监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图: Web监听器 1 什么是web监听器? web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,H…

Linux C/C++ UDP Socket 网络通信

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 昨晚 Vv 让我给她讲讲网络编程,于是我就傻乎乎的带她入了门… 以下内容为讲课时制作的笔记~ 1. sock…