phpにて、1.csvと2.csvのファイルから3.csvのファイルを作成したいのです。

1.csvのファイルサイズが3MB程度なら難なく動いたのですが、16MBですとなぜか動きません。
どうかご教授お願いいたします。

1.csv
1,a-b-c-d
2,e-d
3,a-f-g
4,h-i-d
5,j-d

2.csv
1001,a
1002,b
1003,c
1004,d
1005,e
1006,f
1007,g
1008,h
1009,i
1010,j

3.csv
1,1001-1002-1003-1004
2,1005-1004
3,1001-1006-1007
4,1008-1009-1004
5,1010-1004

<?php
$fcat=fopen("1.csv","r");
$fcat2=fopen("2.csv","r");
touch("3.csv","r");
$fcat3=fopen("3.csv","w+");
$k=0;
while($aryDat=fgetcsv($fcat,10000,",")){
for($i=0;$i<count($aryDat);$i++){
if($i==1){
$aryDat[$i]=str_replace("-",",-,",$aryDat[$i]);
$word[$k][$i]=explode(",",$aryDat[$i]);
$match[$k][$i]=substr_count($aryDat[$i],"-");
}}
$k++;
}
$Data=file('2.csv');
for($m=0;$m<$k;$m++){
for($n=0;$n<2*$match[$m][1]+1;$n++){
for($j=0;$j<sizeof($Data);$j++){
$line=explode(",",$Data[$j]);
$linet[1] = trim($line[1]);
$linet[0] = $line[0]."\n";
$word[$m][1][$n] = trim($word[$m][1][$n]);
if($word[$m][1][$n]==$linet[1]){
if($n==2*$match[$m][1]){
fwrite($fcat3,$linet[0]);
}
else{
fwrite($fcat3,$line[0]);
}}
elseif($word[$m][1][$n]=="-"){
fwrite($fcat3,"-");
break;
}
}}}
fclose($fcat);
fclose($fcat2);
fclose($fcat3);
?>

回答の条件
  • 1人2回まで
  • 登録:2009/09/25 00:13:26
  • 終了:2009/09/25 20:24:10

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/09/25 01:45:53

ポイント70pt

おそらくファイルのサイズが起因していると思いますので、ファイルの内容を読み込む量を減らしています。

2.csv が小さかったので、PHP でそのまま書いてみました。

<?php
    $srcFile=fopen("1.csv","r");
    $dicFile=fopen("2.csv","r");
    $dstFile=fopen("3.csv","w+");
    print "Start\n";
// 2.csv を連想配列として読み込み
    $dicArray = array();
    while( $words = fgetcsv($dicFile,10000,",") ){
        print( $words[0]."//".$words[1]."<br>\n" );
        $dicArray[$words[1]] = $words[0];
    }

    print "Load 2.csv\n";
// 1.csv を1行ずつ読み込み、変換して逐次書き出し
    while( $words = fgetcsv($srcFile,10000,",") ) {
        if( $c++ % 500 == 0 ) { // 500 行ごとに . を出力:動作確認用
            print ".";
        }
        $keys = explode("-", $words[1] );
        $res = $dicArray[$keys[0]];
        for( $i=1 ; $i<count( $keys ) ; $i++ ) {
            $res .= "-". $dicArray[$keys[$i]];
        }
        fwrite( $dstFile,  $words[0]. ",". $res."\n" );
    }
    print "End\n";
    fclose($srcFile);
    fclose($dicFile);
    fclose($dstFile);
?>

ご参考までに。

id:miipa

無事に動きました!!

本当に感謝しております。

しかし、次のプログラムがまた止まっているので、新たに質問しますから、できればまたお願いいたします!!

本当にありがとうございました!!

2009/09/25 20:22:03

その他の回答(1件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/09/25 01:45:53ここでベストアンサー

ポイント70pt

おそらくファイルのサイズが起因していると思いますので、ファイルの内容を読み込む量を減らしています。

2.csv が小さかったので、PHP でそのまま書いてみました。

<?php
    $srcFile=fopen("1.csv","r");
    $dicFile=fopen("2.csv","r");
    $dstFile=fopen("3.csv","w+");
    print "Start\n";
// 2.csv を連想配列として読み込み
    $dicArray = array();
    while( $words = fgetcsv($dicFile,10000,",") ){
        print( $words[0]."//".$words[1]."<br>\n" );
        $dicArray[$words[1]] = $words[0];
    }

    print "Load 2.csv\n";
// 1.csv を1行ずつ読み込み、変換して逐次書き出し
    while( $words = fgetcsv($srcFile,10000,",") ) {
        if( $c++ % 500 == 0 ) { // 500 行ごとに . を出力:動作確認用
            print ".";
        }
        $keys = explode("-", $words[1] );
        $res = $dicArray[$keys[0]];
        for( $i=1 ; $i<count( $keys ) ; $i++ ) {
            $res .= "-". $dicArray[$keys[$i]];
        }
        fwrite( $dstFile,  $words[0]. ",". $res."\n" );
    }
    print "End\n";
    fclose($srcFile);
    fclose($dicFile);
    fclose($dstFile);
?>

ご参考までに。

id:miipa

無事に動きました!!

本当に感謝しております。

しかし、次のプログラムがまた止まっているので、新たに質問しますから、できればまたお願いいたします!!

本当にありがとうございました!!

2009/09/25 20:22:03
id:chrono1742 No.2

chrono1742回答回数91ベストアンサー獲得回数132009/09/25 07:47:51

「なぜか動きません」というのは、具体的にどういう状況でしょうか?お知らせください。


もしタイムアウト・エラーなら、php.iniのmax_excution_timeoutと、もしApacheを使っているならhttpd.confのtimeoutの値を増やしてみて下さい。


お示しいただいたソースにあるforの三重ループがボトルネックになっていると思います。最適化してみてください。

id:miipa

せっかく回答をいただいたのですが、自分のしたいことがうまく伝えられないためはてなを利用しています。

聞かれている内容すら理解できていないため、その程度とご理解ください。

この問題については解決しました。

ありがとうございました。

2009/09/25 20:23:38
  • id:Mook
    php.ini のメモリの上限はいくつになっていますか?
    http://blog.kcg.ne.jp/blog/sato_si/6840
  • id:miipa
    memory_limit = 128M
    の記述をしております。
  • id:Mook
    そうですか。
    では、この点は問題なさそうですね。
  • id:miipa
    そうなんです。
    私の記述したものは全く無視して、新しくプログラムを書いていただけるとうれしいです。
    自分で無理やり動かしているだけで、もっと本当にシンプルな書き方が他にある気がして・・・。
  • id:Mook
    2.csv のファイルサイズはどのくらいなのですか?
    また、PHP で処理する必要はありますか?
  • id:miipa
    2.csvは8KBです。
    PHPで手を加える必要はありません。
  • id:Mook
    デバッグ用の print が残っていました。
    前半の while 中の print は削除してください。

    後半の print も動作確認が不要でしたら、if 文ごと削除してください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません