5

大きな CSV ファイルがあります。いずれかのフィールドの値に基づいて、このファイルを個別のファイルに分割したいと考えています。

これが私がやったことです。fgetcsv を使用して CSV を配列に変換し、 を使用しin_arrayて内容を確認し、配列内に文字列が含まれているかどうかを表示します。

csv に含まれているかどうかを確認するために、別のテキスト ファイルから比較文字列を繰り返し取得します。この場合、「テスト」と指定しました。

以下はコードです:

if (($handle = fopen("test.csv", "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {

             if(in_array("Testing", $data))
             {
               var_dump($data);
             }
        }

        fclose($handle);
    }

これは機能していますが、今は行き詰まっています。$data別の CSV ファイルに書き込むにはどうすればよいですか? または、これを行うより良い方法はありますか?

4

2 に答える 2

6

それは実際には非常に単純で、文字列が行上にあるだけであれば、fgetcsv も必要ありません。ただ

$srcFile = new SplFileObject('test.csv');
$destFile = new SplFileObject('new.csv', 'w+');
foreach ($srcFile as $line) {
    if (strpos($line, 'testing') !== FALSE) {
        $destFile->fwrite($line);
    }
}

これにより、2 つのファイル オブジェクトが作成されます。ソースファイルのコンテンツを保持する最初のもの。2 つ目は、検索文字列を含む行のまったく新しいファイルを作成します。次に、各行を反復処理して、検索文字列が存在するかどうかを確認します。その場合は、宛先ファイルに書き込みます。

この方法では、ソース ファイルは変更されません。検索文字列を含む 1 つのファイルと含まないファイルが 1 つずつ必要な場合は、3 番目の SplFileObject を作成し、else ブロックを if に追加して、その行に書き込みます。最後に、ソース csv ファイルを削除します。

于 2013-05-04T07:31:18.037 に答える
0

あなたはいくつかのトリッキーなことをしなければなりません。私はそうするための基本的なアイデアを提供しています。コードは次のとおりです。

//opening file
if ($fp = fopen('log.csv', 'r')) {
  $line_number = 0;

  //loop for Reading file as line by line csv file
  while ($line = fgetcsv($fp, 0, ';')) {
     if ($line_number++ == 0) {
       continue;
     }

     //array data string to make possible to provide file name 
     //according to column name required
     $date = explode(' ', $line[0]);

     //Change the column name according to your needs
     $file = $date[0] .'.log';

     file_put_contents(
        //change the folder name according to your needs
        'monthly/'. $file, 
        //printing data in appended file
         implode(';', $line) ."\n",
         FILE_APPEND
     );
  }

  //closing file
  fclose($fp);
 }

CSV ファイルを 1 行ずつ読み取り、最初の列から日付部分を抽出し、新しいファイルを作成してデータを追加します。

ノート:

フォルダ「月次」は書き込み可能である必要があります

于 2013-05-04T07:23:29.910 に答える