J'ai récemment écrit un programme php qui compile un fichier CSV en fichiers CSV pour enfants et petits-enfants en vue d'une utilisation ultérieure. Cependant, dans certains fichiers, je continue d'obtenir des octets NULL au même endroit. Lorsque vous écrivez la même chaîne dans un fichier différent, le problème disparaît. J'ai essayé tout ce que je peux penser et je ne trouve pas la source de ce bug. Est-ce que quelqu'un est venu dans ce bug avant?Écriture de fichier PHP - 0x00 apparaissant dans les fichiers
Voici le code:
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);
}
}
un fichier CSV d'entrée de l'échantillon serait (les fichiers réels sont beaucoup plus):
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
et de l'entrée dans ce format (-, #, virgule , \ r \ n s'urlencoded) je me retrouve avec quelque chose comme:
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
Merci à l'avance
[modifier] pour l'enregistrement, la suppression de la garniture ($ str, "\ 0") ne fait aucune différence et ma version php est 5.3.1 (cli)