![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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>";
}
よろしくお願いいたします。
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()を使ってみてください。
ループの中で、
・入力ファイルから読んで
・変換して
・出力ファイルに書き込む
これが基本的な考え方です。
この回答への補足
ご返答ありがとうございます。
$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>";
}
とすれば変換せずに表示できるかと考えました。
でもうまくいきません・・・。
悩ましいです・・・。
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の内容を出力ファイルに書き込む
}
(注)インデントのため、全角空白を使っています。
この回答への補足
$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>";
}
としましたがうまくいきません。どこがおかしいでしょうか?
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)終わり。
この回答への補足
【変更後の作戦】
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)は同時に行うべきですか?
No.4
- 回答日時:
参考URLの同種の質問に対して私が提示した
サンプルコードは試されたのでしょうか?
もし、元のTSVファイルに上書きするのがまずかったのであれば、
file_put_contents()の第1引数を別のファイルにすれば
よいだけのはずです。
参考URL:http://okwave.jp/qa2971977.html
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>';
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);
}
とでもすればよいように思いますが。
No.1
- 回答日時:
>$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>";
}
ということですか?
実行しましたが表示されません。
どのようにしたら良いでしょうか?
悩んでいます・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 値の取り出し方について教えて下さい。 1 2023/03/31 13:30
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP htmlで複数の個数入力欄を表示させるには 1 2022/09/20 03:11
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/03 13:18
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TSVファイルを読み込んでCSV形...
-
printscreenについて。
-
Cookieが保存できない。
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
python renameについて
-
batファイルでrenameができませ...
-
エクセルVBA コードが同じでも...
-
vba dir の相対パス
-
パスから最後のディレクトリだ...
-
close()で例外が投げられる理由
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルを途中行まで...
-
Perlで特定文字列から特定文字...
-
教えて!perlから.exeファイル...
-
C言語でファイル名を取得
-
ファイルへデータ登録2
-
csvファイル改行コードの置換に...
-
openした後、closeしないでプロ...
-
ifstream を利用した1行分のテ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fopenでディレクトリ内の全ファ...
-
unixでのファイルロックの方法...
-
ファイルロックの解除方法
-
printscreenについて。
-
Cookieが保存できない。
-
画像アップロード機能を追加し...
-
CGI二重起動防止ロック処理
-
HTMLの中にCGIファイルリンク
-
VBでファイル分割の方法
-
1行がやたら長いテキストをバッ...
-
flockについて
-
ファイルがオープンできない
-
FC2サーバーでのCGI設置方法に...
-
CGIでhtml出力部分(print、ヒア...
-
DBの環境変数について
-
ファイルディスクリプタとは?
-
[perl] perlで書き込み中に、PC...
-
VBAでCSVファイルを途中行まで...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
おすすめ情報