プロが教えるわが家の防犯対策術!

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

A 回答 (7件)

ついでに・・・


PHPつかうならPHPの使用バージョン書いてください
もしPHP5以降をご利用でしたら

>fwrite関数を使用しないで書き込む事はできないものでしょうか。

fputcsv()なんて関数もあります。
ただ、ファイルに書くときは「fwrite」をつかうものなので
あえてえ「使用しない」理由がわかりません。

とりあえず、初心者なのはわかったので、とにかくマニュアル読んでください
まずはそこからでしょう。

http://www.php.net/manual/ja/refs.fileprocess.fi …
http://www.php.net/manual/ja/function.fgetcsv.php

この回答への補足

ここに模範解答を貼り付けさせて頂きます。

<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>

補足日時:2009/05/23 16:53
    • good
    • 0
この回答へのお礼

再度のアドバイスありがとうございます。
>PHPつかうならPHPの使用バージョン書いてください
すいません。PHP5.2.9ですね。

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

お礼日時:2009/05/19 20:31

構文ミスです。


while (($data = fgetcsv($fp,3000,",")) !== false) {
        ↓
while (($data = fgetcsv($infp,3000,",")) !== false) {

ついつい癖で$fpを使ってしまうもので、、、
    • good
    • 0

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

この回答への補足

自分は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でした。

これを実行させると、

補足日時:2009/05/19 20:10
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/19 19:51

条件定義が不十分。



データ中にダブルクォーテーションあった場合はどうするつもり?
通常csvファイルではデータ中のダブルクォーテーションを
二重ダブルクォーテーションで表記します。

「東京都"港区"赤坂」なら「東京都""港区""赤坂」というcsvデータ
になるということ。

単純なfreadで吸い上げてstr_replaceだとすべてのダブルクォーテーション
がきえてしまいます。

基本はfgetcsv()など、csvのルールにのっとったファイルI/Oを
使うのが余分な作業を減らせるので吉。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/19 19:30

すみません、3行目は


if($f2 = fopen("sampleout.txt","r")){
ではなく
if($f2 = fopen("sampleout.txt","w")){
でした
    • good
    • 0

単純にダブルクォーテーションを取り除くだけでしたら


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);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/19 18:48

http://osaka.cool.ne.jp/rh-riko/Flash-PHP/flashP …

このページは使えますでしょうか?

ちょっとよくわからないのですが、
指定ファイル(hoge.txt)を開く→中身を読み込む→「”」があった場合は空文字に変換→hoge.txtに書き込む→保存→閉じる
といった感じでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/19 10:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!