PHP实现mac2unix、dos2unix文件格式转换
今天尝试用PHP批量读取大量的CSV文件时遇到其中几个文件无法成功解析CSV标记的问题,后来集中一对比发现这些文件全部是有一个为Mac OS编写的、之后才兼容到Linux的程序导出的,这些文件全部是Mac OS Classic格式的。由于文件量很大,不可能实现手工转换,于是考虑向脚本中添加文件转换功能。
Google了一下之后发现了大家统称的mac2unix工具,没有PHP版本的,但找到了Shell和Perl版本的,而且文件都很小,都仅有五六行,于是仔细查阅了一下其中的原理,发现Mac、Unix、DOS文件格式区别在于行尾(EOL),三种文件格式的换行符是不同的,维基百科中提到了三种换行符:
- LF:在Unix或Unix相容系统(GNU/Linux, AIX, Xenix, Mac OS X, …)、BeOS、Amiga、RISC OS
- CR+LF:MS-DOS、微软视窗操作系统(Microsoft Windows)、大部分非Unix的系统
- CR:Apple II家族,Mac OS至版本9
换成PHP来说,Unix的换行符是\n,Mac OS是\r,而Windows/DOS是\r\n,因此只需要将文件中所有的\r全部替换成\n就可以实现文件格式转换了,通过这个原理就可以写出PHP版本的mac2unix、dos2unix了,以下函数是Kaijia刚写的,测试了一下有效:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/** * 将Mac OS格式文件转换为Unix格式 * * @link http://www.kaijia.me/2013/02/php-mac2unix-dos2unix-convert/ * @param string $mac_file 源文件路径 * @param string $unix_file 输出文件路径 */ function mac2unix($mac_file, $unix_file) { $data = str_replace("\r", "\n", file_get_contents($mac_file)); file_put_contents($unix_file, $data); } /** * 将Windows/DOS格式文件转换为Unix格式 * * @link http://www.kaijia.me/2013/02/php-mac2unix-dos2unix-convert/ * @param string $dos_file 源文件路径 * @param string $unix_file 输出文件路径 */ function dos2unix($dos_file, $unix_file) { $data = str_replace("\r\n", "\n", file_get_contents($dos_file)); file_put_contents($unix_file, $data); } |
以上两个函数都会读取$mac_file、$dos_file的文件,然后将转换后的结果保存到新的$unix_file中,你可以自己修改加入更多功能。
评论