2010-12-02 15 views
1

最近、私は最近、CSVを子と孫のCSVにコンパイルして後で使用するためのPHPプログラムを作成しました。しかし、特定のファイルでは、同じ場所でNULLバイトを取得し続けます。同じ文字列を別のファイルに書き込むと、問題は消えます。私は考えることができ、このバグの原因を見つけることができないすべてを試しました。前に誰かがこのバグに来たのですか?PHPファイルの書き込み - ファイルに0x00が表示される

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はURLエンコードます)私のようなもので終わる:

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 

事前

に感謝

レコードの[編集]、トリム($ strの、 "\ 0")を削除すると違いはありませんし、私のPHPのバージョンは5.3.1(CLI)である

答えて

0

気にしないで、IVE(も他の誰か)がありますそれを解決しました。それはWindowsファイルの大文字と小文字の区別がないためです...私はford-capri-color-Black.csvとford-capri-color-black.csvを処理していました。 Windows 8-)

関連する問題