我最近编写了一个 php 程序,将 CSV 编译成子 CSV 文件和孙 CSV 文件供以后使用。但是,在某些文件中,我不断在同一个地方获得 NULL 字节。将相同的字符串写入不同的文件时,问题就消失了。我已经尝试了我能想到的一切,但找不到这个错误的来源。有没有人遇到过这个错误?
这是代码:
error_reporting(E_ALL);
$handles=array();
function get_handle($file) {
global $handles;
$file=unsafe($file);
foreach($handles as $key=>$value) {
if($key==$file) return $value;
}
$handle=fopen($file, "w+b");
$handles[$file]=$handle;
return $handle;
}
function safe($str) {
return str_replace(array(',', "\r", "\n", '#', '-'), array('%2C', '%0D', '%0A', '%23', '%2D'), trim(trim($str), "\0"));
}
function additional_format($str) {
return $str;
}
function unsafe($str) {
return str_replace(array('%2C', '%0D', '%0A', '%23', '%2D'), array(',', "\r", "\n", '#', '-'), $str);
}
$titles=array('server', 'condition', 'vehicle', 'make', 'model');
$fhandle=fopen("input.csv", "r");
while($frow=safe(fgets($fhandle))) {
if(substr($frow, 0, 7)!='http://') continue;
$url=array_map('safe', explode('/', substr($frow, 7)));
$additional=array_map('safe', array_slice($url, 5));
$additional_string=implode(" ", $additional);
$url=array_combine($titles, array_slice($url, 0, 5));
$make=get_handle($url['make'].".csv");
fwrite($make, ucwords($url['model'])."\r\n");
fflush($make);
$variation_types=array();
for($addi=0;isset($additional[$addi])&&!empty($additional[$addi]);$addi+=2) {
if(!isset($variation_types[$additional[$addi]])) {
$variation_types[$additional[$addi]]=array();
}
if(!in_array($additional[$addi+1], $variation_types[$additional[$addi]])) {
array_push($variation_types[$additional[$addi]], $additional[$addi+1]);
}
$variation_file=get_handle($url['make'].'-'.$url['model'].'-'.$additional[$addi].'-'.$additional[$addi+1].".csv");
fwrite(
$variation_file,
trim($frow, ',').",".strtolower($url['model']." ".$additional_string."\r\n")
);
fflush($variation_file);
if(1) fwrite(get_handle("test.csv"), trim($frow, ',').",".$url['model']." ".$additional_string."\r\n");
}
$model=get_handle($url['make'].'-'.$url['model'].".csv");
foreach($variation_types as $type=>$variations) {
fwrite($model, $type.','.implode(',', $variations)."\r\n");
fflush($model);
}
}
示例输入 CSV 将是(实际文件要大得多):
http://server/used/cars/ford/capri/trim/cc-2
http://server/used/cars/ford/capri/engine/2.0
http://server/used/cars/ford/capri/fuel/petrol
http://server/used/cars/ford/capri/transmission/manual
http://server/used/cars/ford/capri/colour/black
http://server/used/cars/ford/capri/colour/blue
http://server/used/cars/ford/capri/colour/gold
http://server/used/cars/ford/capri/colour/purple
http://server/used/cars/ford/capri/colour/red
http://server/used/cars/ford/capri/colour/silver
并且从这种格式的输入(-、#、逗号、\r 和 \n 得到 urlencoded)我最终得到如下内容:
http:/server/used/cars/ford/capri/colour/Black,capri colour black
##0x00 times 2549##http://server/used/cars/ford/capri/trim/cc%2D2/colour/black/door/2,capri trim cc%2d2 colour black door 2
http://server/used/cars/ford/capri/bodystyle/convertible/colour/black/door/2,capri bodystyle convertible colour black door 2
http://server/used/cars/ford/capri/engine/2.0/colour/black/door/2,capri engine 2.0 colour black door 2
http://server/used/cars/ford/capri/fuel/petrol/colour/black/door/2,capri fuel petrol colour black door 2
http://server/used/cars/ford/capri/transmission/manual/colour/black/door/2,capri transmission manual colour black door 2
提前致谢
[编辑] 作为记录,删除 trim($str, "\0") 没有区别,我的 php 版本是 5.3.1 (cli)