1

テキストファイルでいっぱいのディレクトリを開こうとしています。次に、各ファイルを1行ずつ読み取り、各行の情報を新しいファイルに書き込みます。反復しようとしているディレクトリ内の各テキストファイル内で、情報は次のように形成されます。

JunkInfo/UserName_ID_Date_Location.Type

したがって、これらのテキストファイルをすべて開き、新しいファイルに次の形式で行を書き込みます。

UserName,ID,Date,Location,Type

これまでに思いついたコードは次のとおりです。

<?php

$my_file = 'info.txt';
$writeFile = fopen($my_file, 'w') or die('Cannot open file:  '.$my_file); //implicitly creates file

$files = scandir('/../DirectoryToScan');
foreach($files as $file)
{
    $handle = @fopen($file, "r");
    if ($handle) 
    {
        while (($buffer = fgets($handle, 4096)) !== false) 
        {
            $data = explode("_", $buffer);
            $username = explode("/", $data[0])[1];
            $location = explode(".", $data[3])[0];
            $type = explode(".", $data[3])[1];

            $stringToWrite = $username . "," . $data[1] . "," . $data[2] . "," . $location . "," . $type;

            fwrite($writeFile, $stringToWrite);
        }

        if (!feof($handle)) 
        {
             echo "Error: unexpected fgets() fail\n";
        }
        fclose($handle);
    }
}

fclose($writeFile);
?>

だから私の問題は、これはうまくいかないようだということです。何も起こらないだけです。出力ファイルが書き込まれることはなく、その理由もわかりません。

4

1 に答える 1

1

scandir()この回線には1つの潜在的な問題があります。

$files = scandir('/../DirectoryToScan');

パスはで始まり/ます。これは、サーバーのルートを検索していることを意味します。したがって、読み取ろうとしているディレクトリはです/DirectoryToScan。これを修正するには、先頭を削除するだけ/です。もちろん、これはこの例のサンプルパスであり、実際には当てはまらない場合があります。または、システムのルートにその名前のディレクトリがある場合もあります。この場合、このビット=Pは無視してかまいません。

次のことは、fopen()繰り返し処理しているファイルを使用しているときです。フルパスではなく、ファイルの名前scandir()を返します。毎回、ディレクトリ名とファイルを連結する必要があります。

$dir = '../DirectoryToScan/';
$files = scandir($dir);
foreach($files as $file) {
    $handle = @fopen($dir . $file, "r");

私は現在古いバージョンのPHPを実行しているため、return関数から配列インデックスに直接アクセスすることexplode("/", $data[0])[1]はできません(PHP 5.4で追加されました)。

それ以外は、コードの残りの部分は正常に機能するように見えます(私が見落としている可能性のある潜在的なロジック/データエラーを除く)。

于 2012-10-03T19:51:30.183 に答える