PHP实现mac2unix、dos2unix文件格式转换

02/07/2013

今天尝试用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版本的mac2unixdos2unix了,以下函数是Kaijia刚写的,测试了一下有效:

以上两个函数都会读取$mac_file$dos_file的文件,然后将转换后的结果保存到新的$unix_file中,你可以自己修改加入更多功能。