CSV 文件的读写总结



背景:近来用到了csv 文件来编辑保存文件,然后用自己的程序去读写csv文件, 因此自己写了一个读写csv文件的类,大致遇到如下的一些情况,在此记录下。


问题: 原本想法比较简单,只在csv 里面保存 中文和英文,这时用ANSI 查看一切都没有问题,但是问题来了,后来发现我的 CSV 文件是需要保存很多种语言,像西欧

的一些文字(比如 ååå ),在csv 直接输入保存后打开就变成了 ??? 的乱码了。。。


解决方案: 既然用 ANSI 格式来保存的时候有问题,干脆用Unicode 格式来保存就好了。可以如此操作,打开 ANSI 格式的 CSV 文件,修改后另改为其他格式时选  Unicode Text(*.txt)。。。然后再改文件后缀为.csv。。。  如果是自己写程序则直接用unicode 写文件即可。。。。



注意: 

一、 这两种编码格式的分隔是有一定区别的,所以在读写文件是应特别注意。。。。

CSV 的 ANSI 版本,是以 逗号( , )为分隔各个单元格的;

而 Unicode 版本 却是以 制表符 ( \t ) 为分隔的。


二、测试 utf-8 编码的csv 文件,用 文本方式打开,删除所有的内容(即变成一个一行都没有添加的csv文件),保存后再用excel 打开会发现第一格出现"锘“的乱码(实际它就是UTF-8 的前两个标志字节 EFBB )。 为了避免此类问题的发生,在编程时对于一行都没有的csv文件,不妨加上一个回车换行。。这样用excel 打开时就不会出现如此怪异的情况。



=======================================================================================================

以下是一些补充的资料,



ANSI :         无格式定义;
Unicode :      前两个字节为 FFFE ;
Unicode big endian : 前两字节为 FEFF ; 
UTF-8 :        前两字节为 EFBB ;


判断 CSV 文件是否为 unicode ,可以用如下代码来判断。。。

<span style="color:#333333;">// Check if it is unicode file
 if (!file.eof())
 {
  char szText[2];
  file.read(szText, 2);
  if (!file.fail())
  {
   bUnicode = (0xFF == (BYTE)szText[0] && 0xFE == (BYTE)szText[1]);
  }

  if (!bUnicode)
  {
   // reset file position
   file.seekg(0, ios_base::beg);
  }
 }</span>


以下引用百度百科http://baike.baidu.com/link?url=fs-L3AXQspt3WCPHikt9Lf2TQq1UieH9nWT26EWNMDTR6s-FQJDtu3uMuk46_mDtupoHGYQl1JvHVlFj2IU8ypKW2BnN6D3DPKpK2mdAXjm

规则

1 开头是不留空,以行为单位。
2 可含或不含列名,含列名则居文件第一行。
3 一行数据不跨行,无空行。
4 以 半角逗号(即,)作分隔符,列为空也要表达其存在。
5 列内容如存在 半角逗号(即,)则用半角双引号(即"")将该字段值包含起来。
6 列内容如存在半角引号(即")则应替换成半角双引号("")转义,并用半角引号(即"")将该字段值包含起来。
7 文件读写时引号,逗号操作规则互逆。
8 内码格式不限,可为 ASCII、Unicode 或者其他。
9 不支持特殊字符



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值