2010-12-02 51 views
1

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)

Répondre

0

jamais l'esprit, ive (bien quelqu'un d'autre) a résolu. C'était à cause de l'insensibilité à la casse des fichiers Windows ... J'avais des handles pour ford-capri-color-Black.csv et ford-capri-color-black.csv qui étaient en collision. Windows 8-)