- ベストアンサー
TSVファイルを読み込んでCSV形式に変換したい
PHP4でTSVファイルを読み込んでCSVファイルに変換しようとしています。下記のようにしましたがうまくいきません。 どこがおかしいでしょうか? $file="sample.txt"; // 変換対象ファイル $contents =file_get_contents($file); $contents =str_replace("\t", ",", $contents); $fp = fopen ($contents, "r"); while(($line= fgetcsv($fp,1024,","))) { print "line= ".$line[0]."<br>"; print "line= ".$line[1]."<br>"; } よろしくお願いいたします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
> $data="data.csv"; // 変換対象ファイル > $file="sample.txt"; // 書き込みファイル > $fpw = fopen($file,'r'); > $data = fopen($data,'w'); ファイルのオープンモードが逆です。 また、fopen()の第1引数と戻り値は別々にしてください。 > while(($line= fgetcsv($data,1024,","))) { > print "line= ".$line[0]."<br>"; > print "line= ".$line[1]."<br>"; > } 入力ファイルを読み終わった後で、さらにCSV形式として 読もうとしている(しかもファイルポインタが異なる)のは 意図がわかりません。 1個目のwhileループの中で、str_replace()を使って CSV形式に変換しましたよね。その、変換後のデータを、 ループの中で出力ファイルに書き込むのです。 書き込みにはfwrite()を使ってみてください。 ループの中で、 ・入力ファイルから読んで ・変換して ・出力ファイルに書き込む これが基本的な考え方です。
その他の回答 (6)
- asuncion
- ベストアンサー率33% (2127/6289)
> $fpw=fgets($fpw); > $fpw=str_replace("\t", ",", $fpw); fgets()の引数と戻り値は別物です。 $data = fgets($fpw); のように、fopen()で取得したファイルポインタ$fpwから 1行分を読み、内容を$dataに格納します。 これを入力ファイルが終わるまで繰り返す、というのは、 例えば以下のようにします。 while ($data = fgets($fpw); !feof($fpw); $data = fgets($fpw)) { $data = str_replace("\t", ",", $data); // ここで、$dataの内容を出力ファイルに書き込む } (注)インデントのため、全角空白を使っています。
補足
$data="data.csv"; // 変換対象ファイル $file="sample.txt"; // 書き込みファイル $fpw = fopen($file,'r'); $data = fopen($data,'w'); while ($data = fgets($fpw); !feof($fpw); $data = fgets($fpw)) { $data = str_replace("\t", ",", $data); } while(($line= fgetcsv($data,1024,","))) { print "line= ".$line[0]."<br>"; print "line= ".$line[1]."<br>"; } としましたがうまくいきません。どこがおかしいでしょうか?
- asuncion
- ベストアンサー率33% (2127/6289)
> PHP4なのでfile_put_contents()が使えませんでした。いまだに悩んでいます・・・。 これは失礼いたしました。 そうしますと、file_get_contents()でファイルの中身全部を 取ってくるのではなく、作戦を変える必要がありそうです。 【変更後の作戦】 1)TSVファイルを読み込み用にオープンする。 2)CSVファイルを書き込み用にオープンする。 3)以下を繰り返す。 3-1)fgets()で、TSVファイルから1行分を読み取る。すべての行を読み取ったら、繰り返しをやめる。 3-2)str_replace()で、1行分のタブをカンマに変換する。 3-3)fwrite()で、カンマに変換した内容をCSVファイルに書き込む。 4)TSVファイルとCSVファイルをクローズする。 5)終わり。
補足
【変更後の作戦】 1)TSVファイルを読み込み用にオープンする。 2)CSVファイルを書き込み用にオープンする。 3)以下を繰り返す。 3-1)fgets()で、TSVファイルから1行分を読み取る。すべての行を読み取ったら、繰り返しをやめる。 3-2)str_replace()で、1行分のタブをカンマに変換する。 3-3)fwrite()で、カンマに変換した内容をCSVファイルに書き込む。 4)TSVファイルとCSVファイルをクローズする。 の 3)から良くわかりません。 fgets関数を使用したことが無く複数行を取り込む際の書き方がわかりません。 $fpw = fopen($file,'r'); $fp_csv = fopen($fp_csv,'w'); $fpw=fgets($fpw); $fpw=str_replace("\t", ",", $fpw); 3-1)3-2)は同時に行うべきですか?
- asuncion
- ベストアンサー率33% (2127/6289)
参考URLの同種の質問に対して私が提示した サンプルコードは試されたのでしょうか? もし、元のTSVファイルに上書きするのがまずかったのであれば、 file_put_contents()の第1引数を別のファイルにすれば よいだけのはずです。
補足
PHP4なのでfile_put_contents()が使えませんでした。いまだに悩んでいます・・・。
- gogo-tea
- ベストアンサー率75% (25/33)
・しなければならない処理 ・その処理の順番 を整理したほうが良いかと・・・。 自分が想像するには 1.ファイルの内容を読み込む 2.変換処理を行う 3.変換後のデータをファイルに書き込む 4.書き込んだデータをファイルから読み込む 5.読み込んだデータを表示 やりたい事は上記内容ではないでしょうか。 ソースにすると以下のような感じですかね。 $file = "sample.txt"; //1 $contents = file_get_contents($file); //2 $contents = str_replace("\t",",",$contents); //3 if(!($fpw = fopen($file,'w'))){ echo "fopen error";exit; } fwrite($fpw,$contents); fclose($fpw); //4 $result = file_get_contents($file); //5 echo '<textarea name="textarea" cols="50" rows="10">' . $result . '</textarea>';
- sakusaker7
- ベストアンサー率62% (800/1280)
えーと、fopen が成功しているかどうかチェックしてみたらどうです? 多分失敗していると思いますよ、モードがどちらでも。 PHP: fopen - Manual http://jp.php.net/manual/ja/function.fopen.php while(($line= fgetcsv($fp,1024,","))) { print "line= ".$line[0]."<br>"; print "line= ".$line[1]."<br>"; } ファイルから読み出したいのか、書き出したいのかどちらですか? この形式のループは読み出しのためのものですよ? fgetcsvもその名前に 'get'があるとおり読み出しに使うものです。 また、print ... ではファイルには書き込みに行きませんがいいのですか? $contents =str_replace("\t", ",", $contents); で変換結果が $contents に入るのですから、 $fh = fopen('output.csv', 'w'); if ($fh == FALSE) { ___print "書き込みファイルがオープンできませんでした<br />"; } else { ____fwrite($fh, $contents); ____fclose($fh); } とでもすればよいように思いますが。
- sakusaker7
- ベストアンサー率62% (800/1280)
>$contents =str_replace("\t", ",", $contents); ここでタブ→カンマの変換をしていると思うのですが、 > $fp = fopen ($contents, "r"); なぜに変換結果をファイル名として扱いつつしかも読み取りでオープンしようと しているのでしょうか? 新しいファイルを書き込みでオープンして、そこに変換結果を書かなければいけないと思いますが。
補足
$file="sample.txt"; // 変換対象ファイル $contents =file_get_contents($file); $contents =str_replace("\t", ",", $contents); $fp = fopen ($contents, "w+"); while(($line= fgetcsv($fp,1024,","))) { print "line= ".$line[0]."<br>"; print "line= ".$line[1]."<br>"; } ということですか? 実行しましたが表示されません。 どのようにしたら良いでしょうか? 悩んでいます・・。
補足
ご返答ありがとうございます。 $file="sample.txt"; // 変換対象ファイル $fpw = fopen($file,'r'); while (!feof($fpw)) { $data = fgets($fpw)); $line = explode("\t", $data); print "line= ".$line[0]."<br>"; print "line= ".$line[1]."<br>"; } とすれば変換せずに表示できるかと考えました。 でもうまくいきません・・・。 悩ましいです・・・。