- ベストアンサー
txtファイルに書かれた"東京都”のダブルクォーテーションを消したい
例えばsamplein.txtに以下のデータが書かれていたとします。 1000,"東京都港区","港一郎" 1001,"千葉県市川市","市川次郎" 1002,"大阪府大阪市","大阪三郎" これを"(ダブルクォーテーション)だけを全て取り除いてsampleout.txtに書き込むプログラムを作りたいのですが。 これには私の苦手な(どうでもいい事ですが)正規表現を使用します。 私の頭脳では難しい、という感じです。 ヒントでも構いません。どうぞ宜しくお願い致します。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
ついでに・・・ PHPつかうならPHPの使用バージョン書いてください もしPHP5以降をご利用でしたら >fwrite関数を使用しないで書き込む事はできないものでしょうか。 fputcsv()なんて関数もあります。 ただ、ファイルに書くときは「fwrite」をつかうものなので あえてえ「使用しない」理由がわかりません。 とりあえず、初心者なのはわかったので、とにかくマニュアル読んでください まずはそこからでしょう。 http://www.php.net/manual/ja/refs.fileprocess.file.php http://www.php.net/manual/ja/function.fgetcsv.php
その他の回答 (6)
- maenet1972
- ベストアンサー率68% (26/38)
構文ミスです。 while (($data = fgetcsv($fp,3000,",")) !== false) { ↓ while (($data = fgetcsv($infp,3000,",")) !== false) { ついつい癖で$fpを使ってしまうもので、、、
- maenet1972
- ベストアンサー率68% (26/38)
yambejpさんのご指摘のように、単純にfgetcsv()を利用すれば、わざわざ正規表現など使わなくても、ダブルクォーテーションは勝手に外れてくれます。 その、sampleout.txtをどのように利用するかはわかりませんが、単純に前後のダブルクォーテーションを外すだけなら、、、 <?php $infp = fopen("C:\Apache2\htdocs\samplein.txt", "r"); $otfp = fopen("C:\Apache2\htdocs\sampleout.txt", "r+"); $outcsv=""; while (($data = fgetcsv($fp,3000,",")) !== false) { $outcsv.=implode(",",$data)."\n"; } fclose($infp); fwrite($otfp,$outcsv); fclose($otfp); ?> 確認していなので、構文にミスがあったらゴメンナサイ
お礼
アドバイスありがとうございます。 しかも、ソースコードまで書いて頂き、感謝します。 ただ、少し問題点があります。 まず、私の書いたソースコードなのですが、 $otfp = fopen("C:\Apache2\htdocs\sampleout.txt", "r+"); ↑これですね。 モードの部分ですが、必ずしも『r+』とは限らないという事です。 他に適したモードがあるかもしれません。 後は3000の部分ですね。 この数字は何を意味しているのでしょうか。 後はPHP初心者なので意見できる立場でもないのですが、先ほどモードが適しているかどうかは分からない、と書きました。 なので、fwrite関数を使用しないで書き込む事はできないものでしょうか。 すいません、PHP初心者なものでまだ知識足らずの部分が多々ありまして。 ご気分を害されたとしたら、深くお詫び致します。
補足
自分はPHP初心者です。 自分なりに作成したプログラムを見て頂けませんでしょうか。 <?php $infp = fopen("C:\Apache2\htdocs\kadai2_2in.txt", "r"); $otfp = fopen("C:\Apache2\htdocs\kadai2_2out.txt", "w+"); while (!feof($infp)) { $buffer = fgetcsv($infp); fputs($otfp, $buffer); } fclose($infp); fclose($otfp); ?> これだと実行できるのですが、sampleout.txtに書き込まれるのは、ArrayArrayArrayでした。 これを実行させると、
- yambejp
- ベストアンサー率51% (3827/7415)
条件定義が不十分。 データ中にダブルクォーテーションあった場合はどうするつもり? 通常csvファイルではデータ中のダブルクォーテーションを 二重ダブルクォーテーションで表記します。 「東京都"港区"赤坂」なら「東京都""港区""赤坂」というcsvデータ になるということ。 単純なfreadで吸い上げてstr_replaceだとすべてのダブルクォーテーション がきえてしまいます。 基本はfgetcsv()など、csvのルールにのっとったファイルI/Oを 使うのが余分な作業を減らせるので吉。
お礼
アドバイスありがとうございます。 まだPHP初心者なものでfgetcsv関数は初めて知りました。 今検索かけて調べています。 新しい知識が得られた事を心から感謝します。
- saintandre
- ベストアンサー率31% (194/607)
すみません、3行目は if($f2 = fopen("sampleout.txt","r")){ ではなく if($f2 = fopen("sampleout.txt","w")){ でした
- saintandre
- ベストアンサー率31% (194/607)
単純にダブルクォーテーションを取り除くだけでしたら str_replaceだけで済んでしまいますが 取り除くダブルクォーテーションになんらかの条件は ないのでしょうか? 動作検証していませんが特に条件がない場合はこんな感じで if($f1 = fopen("samplein.txt","r")){ $s = fread($f1, filesize($f1)); if($f2 = fopen("sampleout.txt","r")){ $s = str_replace('"','',$s); fwrite($f2,$s); fclose($f2); } fclose($f1); }
お礼
順番が逆転してしまいました。 アドバイスありがとうございます。 そうですね。 str_replace関数ですね。 すっかり忘れていました。
- sykt1217
- ベストアンサー率34% (277/798)
http://osaka.cool.ne.jp/rh-riko/Flash-PHP/flashPHP005.htm このページは使えますでしょうか? ちょっとよくわからないのですが、 指定ファイル(hoge.txt)を開く→中身を読み込む→「”」があった場合は空文字に変換→hoge.txtに書き込む→保存→閉じる といった感じでしょうか?
お礼
アドバイスとURLを貼り付けて頂き、ありがとうございます。 >ちょっとよくわからないのですが、 >指定ファイル(hoge.txt)を開く→中身を読み込む→「”」があった場 合は空文字に変換→hoge.txtに書き込む→保存→閉じる >といった感じでしょうか? 説明が不足していて大変申し訳ありません。 少しソースコードを書いてみます。 ただし、自分が書いたものなので必ずしも正しいとは限りません。 <?php $infp = fopen("C:\Apache2\htdocs\samplein.txt", "r"); $otfp = fopen("C:\Apache2\htdocs\sampleout.txt", "r+"); while ($infp) { $buffer = fgets($infp); ??????????????????????; } fclose($infp); fclose($otfp); ?> 問題は?の部分です。 正規表現を使って"(ダブルクォーテーション)を排除します。 特に空文字に変換する必要はありません。 どうでしょうか。 少しはマシになったでしょうか。
お礼
再度のアドバイスありがとうございます。 >PHPつかうならPHPの使用バージョン書いてください すいません。PHP5.2.9ですね。 >ただ、ファイルに書くときは「fwrite」をつかうものなので >あえてえ「使用しない」理由がわかりません。 正直言いますと、自分は今PHP講座の通信教育を受けてまして、これは、その課題なんですね。 こういう風に書くと、その講座は良くないと思われるかもしれませんが、まだfwrite関数を使用していないのですね。 その代わり、fopen関数のモードを使用するようにという事なんだと思います。 ちょうど今自分なりにソースコードを書いてみました。 結果は少しの進歩はありましたが、失敗でした。 もし宜しければ、見て頂けると大変有り難いです。
補足
ここに模範解答を貼り付けさせて頂きます。 <html> <head><title>kadai2-2</title></head> <body> <?php $infp = fopen("c:\apache2\htdocs\kadai2_2in.txt", "r"); $otfp = fopen("c:\apache2\htdocs\kadai2_2ot.txt", "w"); while(!feof($infp)){ $rep = preg_replace("/\"/","",fgets($infp)); fputs($otfp,$rep); } fclose($infp); fclose($otfp); ?> </body> </html>