• ベストアンサー

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

  • PHP
  • 回答数7
  • ありがとう数3

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

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答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% (2126/6288)
回答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% (2126/6288)
回答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% (2126/6288)
回答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>"; } ということですか? 実行しましたが表示されません。 どのようにしたら良いでしょうか? 悩んでいます・・。

関連するQ&A

  • TSVファイルを読み込んで表示したい

    $file="sample.txt"; // 変換対象TSVファイル $fpw = fopen($file,'r'); while (!feof($fpw)) {   $data = fgets($fpw));   $line = explode("\t", $data);   print "line= ".$line[0]."<br>";   print "line= ".$line[1]."<br>"; } としましたがうまく内容が表示されません。 どのようにしたら良いでしょうか?

    • ベストアンサー
    • PHP
  • TSVファイルをCSV形式に変換したい

    TSVファイルをCSV形式に変換したいのですがどうしたらいいですか?

    • ベストアンサー
    • PHP
  • CSVファイルをTSV形式に変換

    CSVファイルをTSV形式に変換したいのです。単純に置換でやれば済むのですが、それをわざわざしないで変換したいのです。 VECTORなどにそれらしきツールがあったのですが、65536件以上でも使えるツールがなくて困っています。 どなたか良いソフトがあったら教えてください。 また、そういったツールを作成するとしたら、どの言語が一番適切なのでしょうか。

  • CSVファイルを更新する処理

    CSVに追加や削除、一覧表示、更新をする処理を書いたのですが 更新処理だけうまくいかずに躓いています。 readメソッドのreturn $files;のところで下記の syntax error, unexpected '$files' (T_VARIABLE)というエラーが出てしまいます。 なぜエラーが出ているか教えていただけるとありがたいです。 <?PHP function con($hantei, $num, $name, $age, $address){ $data = [ $num, $name, $age, $address ]; $datas = [$data]; // 追加 if($hantei === 'add'){ $fp = fopen('data.csv', 'a'); foreach($datas as $data) { $line = implode(',' , $data); fwrite($fp, $line . "\n"); } fclose($fp); //更新 } elseif ($hantei === 'update') { function read() { $FILENAME = 'data.csv'; $file = fopen($FILENAME, 'r'); while($data = fgetcsv($file)) { $files[] = $data; }   fclose($file);   return $files; } function replace($num, $name, $age, $address) { // read() $files = read(); $arr = array(); foreach($files as $key => $el) { // [0][a, b, c, d] // [1][a, b, c, d] if ($el[0] == $num) { // $arr[0][0] = $num ... $arr[$key] = array($num, $name, $age, $address); } else { $arr[$key] = array($el[0], $el[1], $el[2], $el[3]); } }    return $arr; } replace(); function write($arr){   $FILENAME = 'data.csv'; $file = fopen($FILENAME, 'w');   foreach ($arr as $v) {    fputcsv($file,$v); }    fclose($file); } $arr = replace($num, $name, $age, $address); write($arr); //削除 } elseif ($hantei === 'dalete') { $file = file('data.csv'); unset($file[$num]); file_put_contents('data.csv', $file); //一覧表示 } elseif ($hantei === 'list') { $fp = fopen('data.csv', 'r'); $readed = fread($fp, filesize('data.csv')); print_r($readed); fclose($fp); } } con('update', 1, 'name', 3, 'address');

    • 締切済み
    • PHP
  • CSVファイルやTSVファイルの使い方

    あるデータ(規則性のある)をCSVやTSVに変換するにはどのようにしたらよいのでしょう。それをエクセルやアクセスに流し込むには? オフィス製品ならコピー&ペーストで出来ますよね。又、エクセル、アクセスで作ったデータをCSVやTSVにするには、保存する時にファイルの種類を選んで名前を付けて保存以外に何か方法はあるでしょうか。

  • csvファイルを配列へ格納しブラウザへ出力

    <?php #CAT csvファイルを開く $fp_c = fopen("test.csv","r"); #domain csvファイルを開く $fp_domain = fopen("test.csv","r"); print "<table border='1'>"; #fgetcsv関数がfalseを返却するまで実行 while($c_data = fgetcsv($fp_c)){ print "<tr>"; #csvファイルの列数だけ実行 for($i=0;$i<count($c_data);$i++){ print "<td>".$c_data[$i]."</td>"; } print "</tr>"; } print "</table>"; var_dump($c_data); fclose($fp); ?> このようなプログラムをつくってcsvファイルの各セルを配列$c_data[$i]へ格納している(つもり) なのですが、var_dump($c_data);を入れると bool(false)と表示されてしまいます。 このプログラムではcsvファイルの中身を表示できても配列に格納されていないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • CSVファイルを読み込み表示すると行頭がおかしくなります

    ・CSVファイルを読み込み表示すると行頭がおかしくなります。 -【 CSVファイル(test.csv) 】------------------- 1,単一,必須 2,…,… ----------------------------------------- ・例えば上記のCSVを読み込んで、  PHPで表示すると以下のように表示されます。 -【 ブラウザ表示 】-------------------------- 1 P一 K須 2 … ----------------------------------------- ・というように最初の文字が正常に表示されません。 ・ちなみに数字(半角?)はちゃんと表示されました。 ・プログラムは下のような感じになります。 ・どこを編集すればよいでしょうか? -【 PHP 】--------------------------------- <?php  if( $fp = fopen( 'test.csv', 'r' ) ){   $data = fgetcsv( $fp );   while( ( $data = fgetcsv( $fp ) ) !== FALSE ){    echo $data[0] . ' ' . $data[1] . ' ' . $data[2] . '<BR>';   }  } ?> ----------------------------------------- -【 仕様 】--------------------------------- [OS]: CentOS5 [Server]: Apache_2.2.10 [PHP]: PHP_5.2.6 -----------------------------------------

    • ベストアンサー
    • PHP
  • クライアントのcsvファイルの読込について

    いつもお世話になっております。 Q1)クライアントPC内のCSV(c:\folder\file.csv)を読込みたいのですが、一度サーバーにアップロードさせないと駄目なのでしょうか? 尚、クライアントは複数の拠点にあります。 -------------------------------------------------- 現在、PHPが稼動しているサーバー上のCSV(c:\folder\file.csv)は、 下記のような記述で処理できるのですが、 $csv_f = "c:\folder\file.csv"; // CSVファイル&パス $fp = fopen($csv_f, "r"); // CSVファイル:OPEN while ($data = fgetcsv($fp)) . . クライアントPC内のCSV(c:\folder\file.csv)を読込む方法をご存知の方いらしたらご教授下さい。 <理想形はこうです> 1.クライアントPC内のCSV(c:\folder\file.csv)を読込んで処理。 2.処理後、c:\folder\file.csvは、c:\folder\file_old.csvという   名前にリネームする。 ----------------------------------------- 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • CSVを作成出来たはいいものの・・

    $file_name = "oz_test.csv"; $fp = fopen( $file_name , "w"); $contents = "\"1列目\",\"2列目\"\n"; fputs($fp, $contents); こんな感じでファイルを作成し、 あとは<A>タグでダウンロード出来るまでに至ったのですが、 CSVファイルが、サーバ上に出来たら出来たまま、ディレクトリに残りますよね? ダウンロードが終われば消し去りたいのですが、 ダウンロード時のみに作成し、終われば消える仕組みにしたい。 (メモリ上に作ったら消える?HDD上に作るから消えない?) (非公開ディレクトリにファイルを作ればダウンロードできないだろうし) 何か手はありますか?

    • ベストアンサー
    • PHP
  • CSVファイルの文字コード変換について

    CSVファイルをアップロードし、文字コードをSJISからEUC-JPに変換したいのですが、文字化けが発生します。 ソースは以下のようになっています。 $i=0; $file = fopen($file_path,"r"); while ($data = fgetcsv($file, $file_size, ',')) { for ($j=0; $j < count($data); $j++) { $Array[$i][$j] = mb_convert_encoding($data$j], "EUC", "auto"); }$i++; } PHP5を使用しており、エクセルとテキストエディターでCSVファイルを作成してみましたが結果はどちらも同じでした。 どなたかご教授願います。

    • 締切済み
    • PHP

専門家に質問してみよう