• ベストアンサー

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>"; } よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.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()を使ってみてください。 ループの中で、 ・入力ファイルから読んで ・変換して ・出力ファイルに書き込む これが基本的な考え方です。

eccschool
質問者

補足

ご返答ありがとうございます。 $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>"; } とすれば変換せずに表示できるかと考えました。 でもうまくいきません・・・。 悩ましいです・・・。

その他の回答 (6)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.6

> $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の内容を出力ファイルに書き込む } (注)インデントのため、全角空白を使っています。

eccschool
質問者

補足

$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)
回答No.5

> 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)終わり。

eccschool
質問者

補足

【変更後の作戦】 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)
回答No.4

参考URLの同種の質問に対して私が提示した サンプルコードは試されたのでしょうか? もし、元のTSVファイルに上書きするのがまずかったのであれば、 file_put_contents()の第1引数を別のファイルにすれば よいだけのはずです。

参考URL:
http://okwave.jp/qa2971977.html
eccschool
質問者

補足

PHP4なのでfile_put_contents()が使えませんでした。いまだに悩んでいます・・・。

  • gogo-tea
  • ベストアンサー率75% (25/33)
回答No.3

・しなければならない処理 ・その処理の順番 を整理したほうが良いかと・・・。 自分が想像するには 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)
回答No.2

えーと、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)
回答No.1

>$contents =str_replace("\t", ",", $contents); ここでタブ→カンマの変換をしていると思うのですが、 > $fp = fopen ($contents, "r"); なぜに変換結果をファイル名として扱いつつしかも読み取りでオープンしようと しているのでしょうか? 新しいファイルを書き込みでオープンして、そこに変換結果を書かなければいけないと思いますが。

eccschool
質問者

補足

$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>"; } ということですか? 実行しましたが表示されません。 どのようにしたら良いでしょうか? 悩んでいます・・。