• ベストアンサー

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

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

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

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

  • ベストアンサー
  • 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

  • エクセルのシングルクォーテーション

    お願いします、初心者です。 エクセルの相手先からのファイルに全て(’)シングルクォーテーションが入っていて、列は30あり、そのうちの一部の列のセルの(’)を一括で取る関数とか教えて頂けませんか? A    B    C      D     E      F 01   02   東京都   港区   2-12  ヤマダ 01   03  北海道  札幌市   1-5   スズキ とあればCとDとFの列から(’)を取りたいのです。 お願い致します。

  • 東京都港区or千葉県我孫子市or神奈川県川崎市について・・・

    質問です。 『東京都港区』、『千葉県我孫子市』、『神奈川県川崎市』では、どこが住みやすいでしょうか? 治安、子育て、買い物などの便利性を考慮しています。 どうか教えて下さい。

  • accessでグループ化して集計する方法

    ACCESS2000を使っています。 たとえば、こんなテーブルがあるとします。 |都道府県|市区|区分| |東京都|目黒区|A| |東京都|板橋区|A| |東京都|板橋区|B| |東京都|その他|B| |東京都|その他|C| |千葉県|市川市|A| |千葉県|千葉市|C| |千葉県|その他|A| これを |東京都|目黒区|1| |東京都|板橋区|2| |東京都|その他|2| |千葉県|市川市|1| |千葉県|千葉市|1| |千葉県|その他|3| のように、|区分|に何か入っていたら1カウントして集計したいのですが、どうすればいいでしょうか? 集計クエリで、|都道府県|と|市区|でグループ化したのですが、 |東京都|目黒区|1| |東京都|板橋区|2| |東京都|その他|5| |千葉県|市川市|1| |千葉県|千葉市|1| |千葉県|その他|5| となってしまいます。 |その他|の部分が、どちらも全て合算されてしまいます。 それぞれに出すにはどうしたらいいのでしょうか?

  • Excel 2002 をtxt形式にして書き出すには

    Excel2002を使用しており以下のようなデータがあります。 例 生年月日 氏名 郵便番号 県名  1999/2/2 @@@@ 115-0023 東京都 1998/7/2 @@@@ 335-0005 埼玉県 これを最終的に「.txt」の形式にして「”」でそれぞれのセルを 囲った状態にしたいのです。 (ダブルコーテーション間は半角スペース1個) "生年月日" "氏名" "郵便番号" "県名"  "1999/2/2" "@@@@" "115-0023" "東京都" "1998/7/2" "@@@@" "335-0005" "埼玉県" Excelの機能を使ってテキスト形式に書き出すとタブ区切りになります。 メモ帳の置換機能を使ってタブ区切りになっている部分を「" "」に 置き換えるという方法をとってみたのですが、件数が2000件以上項目数も10項目以上あるため非常に時間がかかる上、「応答なし」で止まってしまいます。 不慣れなAccess2002を使用して、なんとかダブルコーテーションで くくった状態で書き出せたのですが、表記が一部変わってしまいました。 数字       5 ⇒ 5.00 生年月日 1998/7/2 ⇒ 1998/7/2 0:00:00 Accessを使用すればよいようなのですが、具体的にどのように 実行すれば答えにたどり着けるのかが分かりません。 ご存知の方いらっしゃいましたらお力をお貸しください。 お手数おかけいたしますがよろしくお願いいたします。

  • エクセル キーとなる項目で判別し重複データ行を削除したい

    エクセル2002を使用しています。 差込印刷用のデータとして整える方法を教えていただきたいと存じます。 具体的には、子供ごとのレコードデータから、親宛の封筒宛名ラベルを作成したいと考えていて、2人兄弟や3人兄弟の場合でも封筒は1通なので、 キーとなる項目を目安に、不必要な行を削除すればできると考えましたが、具体的な方法がわからないでいます。 現在のデータは、以下のものです。(簡潔にするために列を部分的に省いています) 世帯コード   親の氏名   住所           子の氏名 0011223    鈴木 一郎  東京都千代田区一丁目   鈴木 次郎 0011223    鈴木 一郎  東京都千代田区一丁目   鈴木 三郎 0011223    鈴木 一郎  東京都千代田区一丁目   鈴木 四郎 0011556    山田 花子  埼玉県川口市中央     山田 洋子 0011556    山田 花子  埼玉県川口市中央     山田 和夫 0153355    佐藤 次郎  千葉県船橋市海浜     佐藤 みく 0002333    鈴木 一郎  神奈川県川崎区高津区   鈴木 空 0002333    鈴木 一郎  神奈川県川崎区高津区   鈴木 陸 これを、次のように「世帯コード」で判別して世帯ごとの最初の行だけを抜き出したり、2行目以降を削除したりできれば、差込印刷用のデータとして利用できると思います。 世帯コード   親の氏名   住所           子の氏名 0011223    鈴木 一郎  東京都千代田区一丁目   鈴木 次郎 0011556    山田 花子  埼玉県川口市中央     山田 洋子 0153355    佐藤 次郎  千葉県船橋市海浜     佐藤 みく 0002333    鈴木 一郎  神奈川県川崎区高津区   鈴木 空 (世帯ごとに一行ずつになっています。親の氏名のうち、鈴木 一郎 さんは、同姓同名の方です。世帯コードが違うので区分できます。) エクセルの機能でこのようにできる方法はあるでしょうか? もしくは別の方法でも、宛名ラベルを親宛に一枚印刷できる方法があるでしょうか? お願いいたします。 データ用のシートですので、行や列の挿入や別シートの利用などはすべてできますので、よろしくお願いいたします。

  • ファイル読み込みと書き込み

    JAVA初心者です。 以下のscore.txtというファイルを読み込んで、result.txtというファイルに科目合計と合計の降順にソートして出力したいと思っているんですが、どう記述していいのか全然わかりません。どなたかソースを教えて下さい。(※人数や科目が増えた時に修正しないようにArrayListを使用) (score.txt) 名前,国語,数学,社会,理科,英語 山田一朗80,80,78,60,75 山田次郎40,12,50,37,89 山田三郎60,38,45,68,40 山田四郎85,95,65,57,58 山田五郎90,95,55,45,72 ↓↓↓↓↓↓↓↓↓↓↓↓ (result.txt) 順位 名前 国語 数学 社会 理科 英語 合計 1 山田一郎 80 80 78 60 75 373 2 山田四郎 85 95 65 57 58 360 3 山田五郎 90 95 55 45 72 357 4 山田三郎 60 38 45 68 40 251 5 山田次郎 40 12 50 37 89 228 科目合計 355 320 293 267 334 1569 ------------------------------------------------------------- import java.io.*; class Test { public static void main(String[] args){ File score1 = new File("score.txt"); // ファイル読み込み BufferedReader br = new BufferedReader(new FileReader(score1)); // 最終行まで読み込む while (br.ready()) { String line = br.readLine(); までは何となくわかったのですが・・・・。

  • Excel上、データを行毎にサマリーしたい

    無知ですみません、どなたかエクセル関数、マクロを駆使した効率のいいやり方をご教授下さい。 エクセル上で、以下のようなリスト【サマリー前】について、数量が一致する行をサマリーして【サマリー後】のような形で集計したいのですが、いい手法が思い浮かばずに困っています。 数量の集計だけならピポットテーブルでも事足りると思うのですが、どうしてもは以下のようなリスト形式にまとめたいのです。 地道に1行1行手で集計しようとすると数万行あるため、ミスが怖くてできません。 何卒、よろしくお願い致します。 ■サマリー前 品名   業者   住所      数量 アイス  業者1  東京都渋谷区  1個 アイス  業者1  東京都渋谷区  2個 チョコ  業者2  千葉県市川市  3個 チョコ  業者2  千葉県市川市  2個 アイス  業者2  千葉県市川市  4個 アイス  業者2  千葉県市川市  1個 ↓ ■サマリー後 品名   業者   住所      数量 アイス  業者1  東京都渋谷区  3個 チョコ  業者2  千葉県市川市  5個 アイス  業者2  千葉県市川市  5個

  • エクセルで重複データの削除の方法

    エクセルのSheet1に下記のような住所録データが1万件近くあります。 電話番号をキーに重複するデータは削除したいです。 なにか良い方法がないか御指導下さい。    A     B       C        D 1 氏名   電話番号    郵便番号  住所 2 山田真理 0355551111  100-2222  東京都港区・・・ 3 島本夕太 0432225555  300-5555  北海道札幌市・・・ 4 市川正一 0355559999  444-6666  東京都北区・・・ 5 市川正一 0355559999  444-6666  東京都北区・・・ 6 島本夕太 0432225555  300-5555  北海道札幌市・・・ 7 山田真理 0355551111  100-2222  東京都港区・・・ 8 島本夕太 0432225555  300-5555  北海道札幌市・・・ 9 市川正一 0355559999  444-6666  東京都北区・・・   

  • EXCELから1行を1枚の用紙に印刷する

    EXCELで作った名簿があります。 左から、氏名・住所・電話番号といった列があり次のようになっています。 氏名・  住所・         電話番号     東京一郎 東京都東京区東京町1-1 999-9999-9999 東京二郎 東京都東京区東京町1-2 999-9999-9998 東京三郎 東京都東京区東京町1-3 999-9999-9997   ・   ・   ・ 約100件ほどです。 この名簿で、1人分のデータ(1行分)を小さな紙 (A6) の1枚にそれぞれ印刷したいです。 例えば 1枚目に 氏名   東京一郎 住所   東京都東京区東京町1-1 電話番号 999-9999-9999 2枚目に 氏名   東京二郎 住所   東京都東京区東京町1-2 電話番号 999-9999-9998 3枚目に 氏名   東京三郎 住所   東京都東京区東京町1-3 電話番号 999-9999-9997    ・    ・ というようにです。 プリンターはA6でも打てるので大丈夫です。 各項目は太い罫線でかこみたいです。 件数は入力されているデーター分自動的にプリントできれば有難いです。 EXCELの機能、またはフリーウェア等でうまくできる方法を教えてください。 よろしくおねがいします。

  • 引越時の免許の住所変更についてです!

    大阪から千葉県の市川市に引越しました。 免許証はまだ大阪の住所です。 住所変更はどこでするものなんでしょうか?

専門家に質問してみよう