ジメジメする梅雨のお悩み、一挙解決! >>

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qカンマ区切りのCSVファイルから""を削除したい

初めて質問いたします

以下のような形式のCSVファイルがあります
例)
品名,数量,単価,金額
"りんご",1,150,150
"バナナ",10,200,2000
"メロン","1,000","2,000","2,000,000"

上記のように、品名にはダブルクォーテションがつき、
数量、単価、金額については桁区切りのカンマが発生する場合、ダブルクォーテーションで囲まれています

上記のようなデータを
りんご,1,150,150
バナナ,10,200,2000
メロン,1000,2000,2000000
のように別ファイルへ出力するにはどのようにすればよいでしょうか?

プログラムでの処理で、WSHを使ったものを教えていただけますと、幸いです
よろしくお願いいたします

Aベストアンサー

もう仕事は終わってしまったかもしれませんが、(^^ゞ
VBS で作ってみました。
対象CSVファイルのあるフォルダに保存して実行してみてください。
_NewFilesフォルダに保存されます。
※対象外のCSVファイルが有っても処理してしまいます

Dim oSh
Dim oFs
Dim BaseFolder
Dim newFolder
Dim f

Set oSh = CreateObject("Wscript.Shell")
Set oFs = CreateObject("Scripting.FilesystemObject")
Set BaseFolder = oFs.getFolder(oSh.currentDirectory)

newFolder = BaseFolder.Path & "\" & "_NewFiles"

If oFs.folderExists(newFolder) = False Then
oFs.createFolder (newFolder)
End If

For Each f In BaseFolder.Files
If oFs.GetExtensionName(f) = "csv" Then
Call changeIt(f.Path, newFolder)
End If
Next

MsgBox newFolder & " フォルダ内を検証"


Sub changeIt(orgFname, trgFolder)
Dim oFs
Dim orgF
Dim newF
Dim newFname
Dim buF
Dim oReg

Dim Mcol
Dim M
Dim M1, M2
Const forReading = 1
Const forWriting = 2

Set oFs = CreateObject("Scripting.fileSystemObject")
Set oReg = CreateObject("VBScript.RegExp")
Set orgF = oFs.getFile(orgFname).openAsTextStream(forReading)

newFname = trgFolder & "\" & oFs.getBaseName(orgFname) & "_New.csv"
oFs.CreateTextFile (newFname)
Set newF = oFs.getFile(newFname).openAsTextStream(forWriting)

With oReg
.Pattern = """.*?"""
.IgnoreCase = False
.Global = True
End With

Do Until orgF.atendofstream
buF = orgF.readline
Set Mcol = oReg.Execute(buF)

For Each M In Mcol
M1 = Replace(M.Value, ",", "")
buF = Replace(buF, M.Value, M1)
M2 = Replace(M1, Chr(34), "")
buF = Replace(buF, M1, M2)
Next

newF.WriteLine buF
Loop

orgF.Close: newF.Close
Set Mcol = Nothing
Set oReg = Nothing

End Sub

もう仕事は終わってしまったかもしれませんが、(^^ゞ
VBS で作ってみました。
対象CSVファイルのあるフォルダに保存して実行してみてください。
_NewFilesフォルダに保存されます。
※対象外のCSVファイルが有っても処理してしまいます

Dim oSh
Dim oFs
Dim BaseFolder
Dim newFolder
Dim f

Set oSh = CreateObject("Wscript.Shell")
Set oFs = CreateObject("Scripting.FilesystemObject")
Set BaseFolder = oFs.getFolder(oSh.currentDirectory)

newFolder = Bas...続きを読む

Qダブルコーテーション(

str_replace関数にてダブルコーテーション(")を空白文字列に置換したいのですが、
どのような手法を取ればよろしいのでしょうか?

str_replace(""", "", $file);
ではないことは確認しているのですが。。
ご教授お願いします。

Aベストアンサー

rapid6さんこんにちは。


str_replace("\"", "", $file);

str_replace('"', "", $file);


今回のようにダブルクォーテーションの中でダブルクォーテーションを使おうとする場合は、
エスケープ文字(\)でエスケープしてやる必要があります。

シングルクォーテーションの中でシングルクォーテーションを使用する場合も同じようにエスケープする必要があります。

このあたりは エスケープ文字 などで検索すると詳しくわかると思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報