• ベストアンサー

txtファイルに書かれた"東京都”のダブルクォーテーションを消したい

例えばsamplein.txtに以下のデータが書かれていたとします。 1000,"東京都港区","港一郎" 1001,"千葉県市川市","市川次郎" 1002,"大阪府大阪市","大阪三郎" これを"(ダブルクォーテーション)だけを全て取り除いてsampleout.txtに書き込むプログラムを作りたいのですが。 これには私の苦手な(どうでもいい事ですが)正規表現を使用します。 私の頭脳では難しい、という感じです。 ヒントでも構いません。どうぞ宜しくお願い致します。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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

persona
質問者

お礼

再度のアドバイスありがとうございます。 >PHPつかうならPHPの使用バージョン書いてください すいません。PHP5.2.9ですね。 >ただ、ファイルに書くときは「fwrite」をつかうものなので >あえてえ「使用しない」理由がわかりません。 正直言いますと、自分は今PHP講座の通信教育を受けてまして、これは、その課題なんですね。 こういう風に書くと、その講座は良くないと思われるかもしれませんが、まだfwrite関数を使用していないのですね。 その代わり、fopen関数のモードを使用するようにという事なんだと思います。 ちょうど今自分なりにソースコードを書いてみました。 結果は少しの進歩はありましたが、失敗でした。 もし宜しければ、見て頂けると大変有り難いです。

persona
質問者

補足

ここに模範解答を貼り付けさせて頂きます。 <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>

その他の回答 (6)

回答No.6

構文ミスです。 while (($data = fgetcsv($fp,3000,",")) !== false) {         ↓ while (($data = fgetcsv($infp,3000,",")) !== false) { ついつい癖で$fpを使ってしまうもので、、、

回答No.5

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); ?> 確認していなので、構文にミスがあったらゴメンナサイ

persona
質問者

お礼

アドバイスありがとうございます。 しかも、ソースコードまで書いて頂き、感謝します。 ただ、少し問題点があります。 まず、私の書いたソースコードなのですが、 $otfp = fopen("C:\Apache2\htdocs\sampleout.txt", "r+"); ↑これですね。 モードの部分ですが、必ずしも『r+』とは限らないという事です。 他に適したモードがあるかもしれません。 後は3000の部分ですね。 この数字は何を意味しているのでしょうか。 後はPHP初心者なので意見できる立場でもないのですが、先ほどモードが適しているかどうかは分からない、と書きました。 なので、fwrite関数を使用しないで書き込む事はできないものでしょうか。 すいません、PHP初心者なものでまだ知識足らずの部分が多々ありまして。 ご気分を害されたとしたら、深くお詫び致します。

persona
質問者

補足

自分は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)
回答No.4

条件定義が不十分。 データ中にダブルクォーテーションあった場合はどうするつもり? 通常csvファイルではデータ中のダブルクォーテーションを 二重ダブルクォーテーションで表記します。 「東京都"港区"赤坂」なら「東京都""港区""赤坂」というcsvデータ になるということ。 単純なfreadで吸い上げてstr_replaceだとすべてのダブルクォーテーション がきえてしまいます。 基本はfgetcsv()など、csvのルールにのっとったファイルI/Oを 使うのが余分な作業を減らせるので吉。

persona
質問者

お礼

アドバイスありがとうございます。 まだPHP初心者なものでfgetcsv関数は初めて知りました。 今検索かけて調べています。 新しい知識が得られた事を心から感謝します。

回答No.3

すみません、3行目は if($f2 = fopen("sampleout.txt","r")){ ではなく if($f2 = fopen("sampleout.txt","w")){ でした

回答No.2

単純にダブルクォーテーションを取り除くだけでしたら 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); }

persona
質問者

お礼

順番が逆転してしまいました。 アドバイスありがとうございます。 そうですね。 str_replace関数ですね。 すっかり忘れていました。

  • sykt1217
  • ベストアンサー率34% (277/798)
回答No.1

http://osaka.cool.ne.jp/rh-riko/Flash-PHP/flashPHP005.htm このページは使えますでしょうか? ちょっとよくわからないのですが、 指定ファイル(hoge.txt)を開く→中身を読み込む→「”」があった場合は空文字に変換→hoge.txtに書き込む→保存→閉じる といった感じでしょうか?

persona
質問者

お礼

アドバイスと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); ?> 問題は?の部分です。 正規表現を使って"(ダブルクォーテーション)を排除します。 特に空文字に変換する必要はありません。 どうでしょうか。 少しはマシになったでしょうか。

関連するQ&A