「夫を成功」へ導く妻の秘訣 座談会

$a = qq/"aaaaaa","bbbbb"/;
print $a;
→ "aaaaa","bbbbb"

としたときの、変数 $a の中にある
ダブルクォーテーションを削除したいのですが、

$a =~ s/"//;
では何も変化が無くて、

$a =~ tr/"/ /;
では半角スペースに置換できるのですが、

$a =~ tr/"//;
では何も変化がありません。

上手く出来る方法はどの様な方法でしょうか?
教えていただければありがたいです。

よろしくお願いいたします。

A 回答 (2件)

$a =~ s/"//;


とした時には
→aaaaa","bbbbb"
という風に一つ目の「"」だけは無くなっていませんか?
$a =~ s/"//g;
とすれば全ての「"」を削除できます。

また、tr///を使う時には、
$a =~ tr/"//d;
とすれば変換先リストに無い文字を削除できます・

参考URL:http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …
    • good
    • 0
この回答へのお礼

ありがとうございます!
オプション付け忘れていました・・

お礼日時:2005/01/03 23:18

$a =~ s/"//g;



で全て削除されると思います。

> $a =~ s/"//;

でも先頭のが削れてるはずですが。

> $a =~ tr/"//;

の挙動は仕様です。詳しくはドキュメントperlopをご覧ください。
    • good
    • 0
この回答へのお礼

ありがとうございます、まさにそのとおりで、
先頭のは削除されておりました。
オプション付け忘れですね・・申し訳ございません。

お礼日時:2005/01/03 23:20

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

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

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

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

Qダブルクォーテーションを含む正規表現について。

正規表現によるマッチング(?)を勉強しています。

例えば「blog」という文字列で、マッチングを試みる場合は、
String str = "blog";
で、strに格納すると思うのですが、例えば「link rel=""」という文字列でマッチングを試みる場合はどうすればいいのでしょうか?
「""」の部分をそのまま文字列のダブルクォーテーションの中に入れると、エラーになってしまうので、何か別のやり方が必要だと思うのですが、わかりません…。

Aベストアンサー

もとい

”abc"abc”は”abc\"abc”と記述します

Q文字列からダブルクオートの削除

お世話になります、

CSVからデータを取得してDBに書き込む処理を行っているのですが、CSVデータで型が文字のものはダブルクオート(")でくくっています。
(例)
"りんご",100,"円"
"ばなな",200,"ドル"

このままデータをStringTokenizerクラスを使用して取得した場合りんごは("りんご")のようにダブルクオートがついた状態で取得されてしまいます。
ダブルクオートを取り外す方法またはメソッドを教えていただきたいのですが、よろしくお願いします。

Aベストアンサー

以前作成した1行文字列をフィールド分割する関数ソースを載せておくので
参考にしてください。
もっといい方法があるのかもしれませんが、とりあえずここでは
一文字ずつ呼んでダブルクオートを削除し、又ダブルクオート内の
カンマはそのまま文字として使用するようにしてます。
面倒だったので文字内にダブルクオートを使用することは考慮に入れてません(^^;

ArrayList parsLine(String line){
 ArrayList fields = new ArrayList();
 if(line == null) return;
 boolean isQuort = false; //ダブルコーテーション内フラグ
 StringBuffer field = null;
 for(int i=0;i<line.length();i++){
  char code = line.charAt(i);
  if(isQuort){
//ダブルクオート内
   if(code == '\"'){
    isQuort = false;
   }
   else{
    if(field == null) field = new StringBuffer();
    field.append(code);
   }
  }
  else{
//ダブルクオート外
   if(code == '\"'){
    isQuort = true;
   }
   else if(code == ','){
    if(field == null) field = new StringBuffer();
    fields.add(field.toString());
    field = null;
   }
   else{
    if(field == null) field = new StringBuffer();
    field.append(code);
   }
  }
 }

 if(field != null){
  fields.add(field.toString());
 }
 return fields;
}

以前作成した1行文字列をフィールド分割する関数ソースを載せておくので
参考にしてください。
もっといい方法があるのかもしれませんが、とりあえずここでは
一文字ずつ呼んでダブルクオートを削除し、又ダブルクオート内の
カンマはそのまま文字として使用するようにしてます。
面倒だったので文字内にダブルクオートを使用することは考慮に入れてません(^^;

ArrayList parsLine(String line){
 ArrayList fields = new ArrayList();
 if(line == null) return;
 boolean isQuort = false; //ダ...続きを読む

Qperlでcsvファイルを読む(ダブルコーテーション内カンマを無視したい)

perlでCSVファイルを読み込むスクリプトを作っています。

以下のようなCSVファイルがあります。

■CSVファイル
東京,よろしくお願いします。
大阪,はじめまして
九州,"5,000円でお願いします"

カンマで区切り、以下のようにすると、"5,000円"の部分が2つに分かれてしまいます。
($data1,$data2) = split(/,/,$all_data)

前後にダブルコーテーションがあった場合、中のカンマで区切らないような良い方法はないでしょうか?

環境:
Perl 5.8.5

Aベストアンサー

Text::ParseWords を使ってこんなのはどうですか。(例ではparse_lineを使っています)
もしquoteを残したければundefを1に変えてください。

use Text::ParseWords;

$" = "\t";
while (<DATA>) {
chomp;
my @words = &parse_line(',', undef, $_);
print "@words\n";
}

exit 0;
__DATA__
東京,よろしくお願いします。
大阪,はじめまして
九州,"5,000円でお願いします"

Qダブルクォートで囲まれた文字列の取り出し

Windows環境でRuby 1.8.7を使用しております。

----sample1.txt-----
hoge"foo\"bar\"foo"hage"bar\"baz\"bar"hoge
------------------

ファイルから1行ずつテキストを読み込んで処理を行います。上のsample.txtの様な行を読み込んだ場合にダブルクォートで囲まれた部分
foo\"bar\"foo
bar\"baz\"bar
を取り出すのにはどの様な正規表現を用いればよろしいでしょうか?
エスケープされたダブルクォートを除ける上手い方法がわかりません。


また、ダブルクォートで囲まれた部分が複数行にまたがる場合はどの様に処理をすれば良いでしょうか?
-----sample2.txt-----
hoge"foo
\"bar\"
baz"
hage
----------------------
-----sample3.txt-----
hoge"foo
\"ba
r\"baz"
hage
----------------------
最初の例のように1行の場合は
File.foreach(file) do | line | …… end
で良いのですが、複数行の場合には同じように単純には行きません。
ダブルクォートの数を数えて、奇数の場合は偶数になるまで次行をくっつける様な処理を考えているのですが、もっと適切な方法はありますか?

宜しくお願いします。

Windows環境でRuby 1.8.7を使用しております。

----sample1.txt-----
hoge"foo\"bar\"foo"hage"bar\"baz\"bar"hoge
------------------

ファイルから1行ずつテキストを読み込んで処理を行います。上のsample.txtの様な行を読み込んだ場合にダブルクォートで囲まれた部分
foo\"bar\"foo
bar\"baz\"bar
を取り出すのにはどの様な正規表現を用いればよろしいでしょうか?
エスケープされたダブルクォートを除ける上手い方法がわかりません。


また、ダブルクォートで囲まれた部分が複数行にまたがる...続きを読む

Aベストアンサー

前者については
"((?:[^\\"]|\\.)*)"
にマッチさせればいいと思う. 後者は「全体を 1つの文字列にする」のが最も単純ではないでしょうか.

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数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Q文字列に含まれているダブルクォーテーション( ")を置換する

文字列に含まれているダブルクォーテーションを除きたいのですが、これをSubstitute関数で置換しようとしてもうまくいきません。ダブルクォーテーションが文字列を指定するために使われるせいだと思うのですが、"を文字列として指定する方法はあるのでしょうか?
よろしくお願いします。

Aベストアンサー

=SUBSTITUTE(A1,CHAR(34),"a")

のように、CHAR(34)で表せば大丈夫だと思います。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Qダブルクォーテーションのreplaceの方法

JavaScriptで文字を置換する際に
AAA = new String(AAA).replace(/ZZZ/g, "QQQ");
にしますよね、これで文字列中のダブルクォーテーション「"」を
任意の文字に変換したいのですが、何か良い方法はないでしょか?

よろしくお願いします。

Aベストアンサー

AAA.replace(/\"/g,"Q");
このように「"」の前に\をつけるといいですよ。

Q正規表現で囲まれた部分の文字列

正規表現でダブルコーテーションで囲まれた部分の文字列
を検索したいのです。
\"([^\"])*\"
とりあえずこんな感じで検索はできるのですが
問題はダブルコーテーションで囲まれた部分の
エスケープ文字\の判定が上手くできません。
([^\"])
この部分でダブルコーテーション以外の文字列、
ただし\"は除くって感じにしたいのですがどうすれば良いでしょうか。
宜しくお願いします。

正規表現のエンジンはBREGEXP.DLLです。
http://www.hi-ho.ne.jp/babaq/bregexp.html

Aベストアンサー

([^\"])

(\\\"|[^\"])
としたらでどうでしょうか。


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

人気Q&Aランキング