正确处理 CSV 文件的引号和逗号

简介: CSV(Comma-Separated Values,逗号分割值),就是用纯文本的形式存储表格数据,最大的特点就是方便。但是你真的会处理 CSV 文件吗?数据包含引号或逗号,该怎么办?

CSV(Comma-Separated Values,逗号分割值),就是用纯文本的形式存储表格数据,最大的特点就是方便。

作为开发,我们经常面临导数据的问题,特别是后台系统,产品或者运营的同事常常会提需求。

Emmm,实话说,直接用 PHPExcel 也是 OK 的,不管是 WPS Office 或者微软 Office,都能完美支持。

但我还是比较喜欢 CSV,原因是容易实现。有时候跑脚本、写爬虫抓数据,纯文本拼接后输出真的非常舒服。

当我遇到了几个问题:

  • 发现如果原来的文本带有回车或者换行,拼接后整行就断开了;
  • 加引号可以解决,但是引号中间有引号怎么办?用 \ 转义也不行;
  • 逗号怎么办?

于是翻了谷歌,看到维基百科有 逗号分隔值 的标准化定义:

  • 以(CR/LF)字符结束的DOS风格的行(最后一行可选)。
  • 一条可选的表头记录(没有可靠的方式来检测它是否存在,所以导入时必须谨慎)。
  • 每条记录“应当”包含同样数量的逗号分隔字段。
  • 任何字段都可以被包裹(用双引号)。
  • 包含换行符、双引号和/或逗号的字段应当被包裹。(否则,文件很可能不能被正确处理)。
  • 字段中的一个(双)引号字符必须被表示为两个(双)引号字符。

好像也不难 :)

关键就是最后那两点——不多说,直接看代码:

function csv_string($s)
{
    return '"'. str_replace('"', '""', trim($s)) .'"';
}

$value1 = csv_string($value1);
$value2 = csv_string($value2);
$value3 = csv_string($value3);
$line   = "{$value1},{$value2},{$value3}\r\n";

简单粗暴。


文章来源于本人博客,发布于 2018-06-02,原文链接:https://imlht.com/archives/167/

目录
相关文章
|
8月前
|
IDE 开发工具 C++
|
8月前
|
移动开发
基于Notepad++ 快速替换 换行符 为 逗号
【5月更文挑战第5天】基于Notepad++ 快速替换 换行符 为 逗号
|
8月前
|
Java
java读取txt文件,使用逗号,分号,空格,回车将文件内容分割成一个一个的词组,找出所有重复的词组
java读取txt文件,使用逗号,分号,空格,回车将文件内容分割成一个一个的词组,找出所有重复的词组
163 38
|
8月前
|
Shell Perl
用sed如果原字符串或新字符串中包含特殊字符(如正斜杠/或其他特殊字符),需要用\进行转义
用sed如果原字符串或新字符串中包含特殊字符(如正斜杠/或其他特殊字符),需要用\进行转义
938 7
excel删除空格之后的字符
excel删除空格之后的字符
|
8月前
将字符串以某个分隔符分隔
将字符串以某个分隔符分隔
|
JavaScript 前端开发
Javascript解析CSV字符串,其中包含数据中的逗号
Javascript解析CSV字符串,其中包含数据中的逗号
97 0
|
数据采集 移动开发
一日一技:在字符串中批量替换单个字符
一日一技:在字符串中批量替换单个字符
148 0
[oeasy]python0052_ raw格式字符串_单引号_双引号_反引号_ 退格键
[oeasy]python0052_ raw格式字符串_单引号_双引号_反引号_ 退格键
116 0
[oeasy]python0052_ raw格式字符串_单引号_双引号_反引号_ 退格键
获取字符串内双引号中的所有内容
获取字符串内双引号中的所有内容
157 0
获取字符串内双引号中的所有内容