人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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);
?>

●質問者: miipa
●カテゴリ:コンピュータ
✍キーワード:009-1 CSV PHP trim Word
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Mook
●70ポイント ベストアンサー

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

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);
?>

ご参考までに。

◎質問者からの返答

無事に動きました!!

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

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

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


2 ● chrono1742
●0ポイント

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


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


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

◎質問者からの返答

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ