(秀丸)正規表現で、CSV内金額へ消費税計算置換

このQ&Aのポイント
  • 正規表現を使用してCSVテキストファイル内の金額を消費税計算に置換する方法について教えてください。
  • CSVテキストファイルの中に含まれる金額を正規表現で抽出し、消費税を計算して置換する方法についてお伺いします。
  • (秀丸の)正規表現を利用して、CSVテキストファイル内の金額を消費税計算に置換する方法を教えてください。
回答を見る
  • ベストアンサー

(秀丸)正規表現で、CSV内金額へ消費税計算置換

お世話になります。 (秀丸の)正規表現について教えてください。 たとえば、CSVテキストファイルに、1行、 ABC,DEF,"10,000円","10,500円",GHI という文字列が存在しています。 そこでご質問なのですが、 (秀丸の)正規表現を利用し、 上記"10,000円"の文字列を、 10000と判断させて、その数値に対して1.08掛け算して(8%消費税を加算して、) 右となりの、上記"10,500円"を、"10,800円"と変更して置換したいです。 (ちなみに秀丸は、2013年12月16日(月)現在の  最新バージョンVer8.32を利用しています) 以上になります。 宜しくお願いいたします。

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

#4です。 以下のスクリプトを作成してください。 文字コードはutf-8にしなければいけません。 ----------------------------------------- # 注意事項:このスクリプトはutf-8コードで作成すること use strict; use warnings; use utf8; use Encode; use Text::CSV_XS; my $file = shift(@ARGV); my $csv = Text::CSV_XS->new ({ binary => 1, 'quote_char' => '`', 'escape_char' => '`', }) or die "Cannot use CSV: ".Text::CSV->error_diag (); open my $fh, "<:encoding(cp932)", $file or die "$file: $!"; while (my $row = $csv->getline ($fh)) { my $item1 = encode('cp932',$row->[0]); my $item2 = encode('cp932',$row->[1]); my $item3 = encode('cp932',$row->[2]); my $item4 = encode('cp932',$row->[3]); my $item5 = encode('cp932',$row->[4]); # ,と円を取り除く my $val3 = &get_value($item3); my $val4 = int($val3 * 1.08); # ,と円を付加する $item4 = &set_value($val4); # バッククオートで両端をくくる $item1 = &wrap_quote($item1); $item2 = &wrap_quote($item2); $item3 = &wrap_quote($item3); $item4 = &wrap_quote($item4); $item5 = &wrap_quote($item5); my @item = (); push @item,$item1; push @item,$item2; push @item,$item3; push @item,$item4; push @item,$item5; my $newline = join ',',@item; print $newline,"\n"; } $csv->eof or $csv->error_diag (); close $fh; # ,と円を取り除く sub get_value { my $item = shift(@_); $item =~ s/[^\d]//g; return $item; } # ,と円を付加する sub set_value { my $item = shift(@_); 1 while $item =~ s/(.*\d)(\d\d\d)/$1,$2/; $item .= encode('cp932','円'); return $item; } # バッククオートでくくる sub wrap_quote { my $item = shift(@_); $item = '`' . $item . '`'; return $item; } ----------------------------------------------------- 上記のスクリプトをsample.plとします。 CSVテキストファイルをinput.txtとすると コマンドプロンプトで、input.txtが存在するディレクトリに移動し、 perl sample.pl input.txt > output.txt とします。 output.txtが期待する結果です。 こちらでの確認結果です。 perlのバージョン v5.14.2 input.txtの内容 --------------------------- `ABC`,`DEF`,`10,010円`,`10,500円`,`GHI"` `ABC1`,`DEF`,`11,010円`,`10,500円`,`GHI` `ABC2`,`DEF`,`12,010円`,`10,500円`,`GHI` `ABC3`,`DEF`,`13,010円`,`10,500円`,`GHI` `ABC4`,`DEF`,`14,010円`,`10,500円`,`GHI` `ABC5`,`DEF`,`810円`,`10,500円`,`GHI` `ABC6`,`DEF`,`10円`,`10,500円`,`GHI` --------------------------------- output.txtの内容 --------------------------- `ABC`,`DEF`,`10,010円`,`10,810円`,`GHI"` `ABC1`,`DEF`,`11,010円`,`11,890円`,`GHI` `ABC2`,`DEF`,`12,010円`,`12,970円`,`GHI` `ABC3`,`DEF`,`13,010円`,`14,050円`,`GHI` `ABC4`,`DEF`,`14,010円`,`15,130円`,`GHI` `ABC5`,`DEF`,`810円`,`874円`,`GHI` `ABC6`,`DEF`,`10円`,`10円`,`GHI` ---------------------------------------- 注意事項 sample.pl はutf-8で作成、改行コードは、CR+LF input.txt はshift-jis、改行コードは、CR+LF で確認しています。 文字コードと改行コードは、秀丸の ファイル->エンコードの種類 で確認又は設定してください。 また、金額を1.08倍したときの1円未満は切り捨てています。

sublota22
質問者

お礼

早々にPerlスクリプトをご回答いただきましたので、 さっそく動かしてみたところ、 ご提示いただきましたoutput.txtの内容と 同じ内容のテキストが正常に出力されました。 本当に助かりました。 ありがとうございました。

その他の回答 (4)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

#3です。 今、業務中ですので、申し訳ありませんがperlでの回答は今日の夜になります。 1点質問ですが、 >一部修正(ダブルコーティションではなくて、`文字で全ての各フィールドを囲っている) となっていますが、 `文字は、本当にバッククオート(shift+@)ですか、 それとも、シングルクオート(shift+7)ですか、 あなたの提示された`文字は、バッククオートですが、 通常、バッククオートで、くくることはないので、念のための確認です。

sublota22
質問者

補足

ご質問の件ですが、 「バッククオート(shift+@)」 で、全ての各フィールドを囲っていました。 phpMyAdminで、MySQLのテーブルを CSVファイルとして、エクスポートした際に、 「フィールド囲み記号」として、 `文字(バッククオート(shift+@))で、 指定していた為でした。 PS: perlでの回答を今日の夜にいただけるとのこと、 本当にありがとうございます。 いただきましてから、 おそらく明日になるかと存じますが早々に動かしてみます。 以上、宜しくお願いいたします。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

本件ですが、秀丸のマクロで処理するには、荷が重過ぎるようです。 #2の方がいわれているように、excelで処理するか、perl,ruby等で処理するほうが、楽かと思います。 もし、perlまたはrubyで行うならば、まず、perlまたはrubyをあなたのマシンにインストール する必要があります。 もし、インストールを行ってでも、perl又はrubyで本件を解決したいと望まれるなら、 perl又はrubyの本件を処理するスクリプトを私のほうで提示することは、可能です。 その場合は、インストール完了後にその旨、補足ください。 (その際、perl又はrubyのバージョンもご提示ください。)

sublota22
質問者

補足

お世話になります。 コメントありがとうございます。 たまたまActivePerl Ver5.14.2(Windows7 32bit環境内)が、 私のパソコンにインストール済でした。 お手数をおかけいたしますが、 もしPerlのスクリプトをご提示いただけるようでしたら、 ぜひお願いいたします。 (ご提示いただき次第、本日出来るだけ早急に動かして試してみます) なお、 先ほど、私の方で補足といたしまして、 一部修正(ダブルコーティションではなくて、`文字で全ての各フィールドを囲っている)と、 1~3ケタ以内の金額には、カンマが付いていないケースもあることを 追記させていただいておりますので、 あわせて、宜しくお願いいたします。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

たびたびすいません もしかして正規表現でなくマクロの話でしょうか? 正規表現で数字部分をマッチさせるも全体はマクロで処理云々ということでしょうか? CSVならExcelでやった方が早くないですか?

sublota22
質問者

お礼

いつもお世話になっております。 前回も教えていただき助かりました。 今回も、秀丸の正規表現で演算が出来ないことに 気づかせていただいたり、Excelを利用する発想など、 アドバイスいただきまして、大変勉強になりました。 本当にありがとうございました。

sublota22
質問者

補足

お世話になります。 コメントありがとうございます。 私は最近正規表現を始めたばかりで、 よく理解していない為、ちんぷんかんぷんな ご質問をしてしまっているのかもしれません。 目的は、CSVファイルに対して、今回ご質問させていただきました 文字列の置換が実施したいということでしたので、 それが可能でしたら、 秀丸でも、ExcelでもOKという状況です。 PS: すみません。 ご質問内容に対して、一部訂正と、例を追加させてください。 (1)「一部訂正」 例の1行はダブルコーティションでしたが、実際には、 すべての各フィールドに対して、 ` 文字で囲まれていました。 (`ABC`,`DEF`,`10,000円`,`10,500円`,`GHI`) (2)「例の追加」 例の1行の金額には、3ケタ区切りのカンマが付いていましたが、 1~3ケタまでの金額には、カンマが付いていないケースも存在していました。 (`ABC`,`DEF`,`100円`,`105円`,`GHI`) 以上になります。 ExcelでもOKですので、 ご質問内容を実現する方法がございましたら、 ぜひ教えてください。 宜しくお願いいたします。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

逆に質問で申し訳ないのですが正規表現で演算ってできましたっけ?

参考URL:
http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE

関連するQ&A

  • 秀丸で正規表現を使って置換

    あるファイルに関して、このような置換を行いたいです。 abc/xxx,yyy,zzz.html ↓ abc/xxx.html xxxとyyyとzzzはある任意の文字列(英数字で文字数はばらばら)で 「abc/」と「,」と「.html」は固定の文字列になります。 そこで、秀丸で開いて、正規表現による検索で、 「abc/.*,.*,.*.html」 として検索すると、該当部分が検索できることがわかりましたが、置換後をどのように設定すればいいのかわかりません。 置換後のabc/xxx.htmlの「xxx.html」の部分は検索前の任意の文字列をそのまま残したいのです。 秀丸の置換機能でこのようなことは可能でしょうか? 正規表現に関してあまり詳しくないので教えてください。

  • 秀丸の置換で正規表現を使う方法を教えてください

    お世話になります 秀丸エディタの置換を用いて、 (’.ab12#-cd’)のような文字列や数字、記号のまじった ( )から( )の中身を検索置換して (’’)にしたいと考えています。 具体例 (’.ab12#-cd’) (’.ab#37-c’) (’..ab-82#d%’) (’.12jg+#ppv’) (’.ab12lentext’)から ↓ (’’)に置換したい。 秀丸を使うときはあっても単純な 一文字程度の検索置換しかおこなったことがなく どうにも方法がうかばなかったところ 友人から、正規表現というものを 使えば実現できるようだと聞きました。 友人も残念ながら、プログラミングの経験は あまりなくて正規表現での記述方法は わからないいうことでした。 正規表現を使ってこれを実現する方法を 教えていただけませんでしょうか よろしくお願いいたします

  • 秀丸での正規表現を使用した置換

    いつもお世話になっております。 秀丸で正規表現を使用した置換処理を行いたいと思うのですが、どうしても正規表現の式が書けません。 どうかご教示下さい。 <置換前> ABC1 あAbCd++ ... ... ・先頭4文字は半角英数字の大文字固定 ・その後ろにタブ ・最後にかな、英数字、記号などの可変長の文字列 上記で1レコードです。 <置換後> ABC1 String 内容 あAbCd++ ... ... ・先頭4文字そのまま ・その後ろにタブを3つ+改行 ・続いて「内容」という文字列+改行 ・最後に可変長の文字列をそのまま+改行 「置換」の正規表現は以下だと思うのですが、英数字4文字と可変長文字列を別々にマッチさせる「検索」がどうしても分かりません。 \0 String\n内容\n\1\n どうかご教示下さい。 <環境> Ver.6.1.4

  • 秀丸で正規表現による置換

    正規表現でつまずいてしまったので教えてください。 こういうデータがあったとして ,,E,77774000,1,77770004480,〇〇〇,0,,,,,l_ ,,E,77774000,13,77770004479,〇〇〇,0,,,,,l_ ,,E,77774000,21,77770004478,〇〇〇,0,,,,,l_ ,,E,88884000,5,88880004480,〇〇〇,0,,,,,l_ ,,E,88884000,14,88880004479,〇〇〇,0,,,,,l_ ,,E,88884000,20,88880004478,〇〇〇,0,,,,,l_ 6列目に77770004480があったら、5列目の1を10にする。 6列目に88880004480があったら、5列目の5を10にする。 という事がしたいのですが、7777や8888の部分は必ず数字4桁で固定ですが、 実際には0000-9999まであるため、1万回置換するのは面倒です。 そこで、0004480があったら、ヒットする1や5を10に置き換える事がしたいのですが どのようにしたらいいでしょうか? また、12を2に置き換えることもあるので、5列目は 必ず数字ですが、1桁または2桁となります。 正規表現置換で使用するエディタは、秀丸です。 ,,E,77774000,1,77770004480,〇〇〇,0,,,,,l_ ↓ ,,E,77774000,10,77770004480,〇〇〇,0,,,,,l_ ,,E,88884000,5,88880004480,〇〇〇,0,,,,,l_ ↓ ,,E,88884000,10,88880004480,〇〇〇,0,,,,,l_ 以上よろしくおねがいいたします

  • 秀丸エディタの正規表現

    秀丸エディタの正規表現 これから述べる置換処理について教えてください。 条件を表現します。 まず半角空白文字を _ このように全角アンダースコアであらわします。 そしてマッチさせたいSTRINGは _ このように半角空白文字がそれ以外の文字に前後をはさまれている状態ではなくて、 、 __ このように半角空白文字二個もしくは二個以上続いたものが半角空白文字以外に挟まれているパターンです。 。 ちなみに置換後の文字列は __ ですつまり空白半角文字列二個です。 よってこの質問は次のようにも言い換えられます。 。 検索文字列 半角空白文字二個以上 を置換後文字列 半角空白文字二個に置き換える。もしくは、半角空白文字三個以上を 置換後文字列 半角空白文字二個に置き換える。 というのが質問です。おねがいします。 すみませんつけたしです。上記を実現する正規表現を教えてください。

  • 正規表現で一括置換

    現在、数多くの長文データを、テキストエディタの置換機能で一括置換しています。 jeditX(または秀丸エディタ)の正規表現をもちいた複数一括置換について質問させていただきます。 私は正規表現やPC言語の初心者です。どうぞよろしくお願いいたします。 かなり困り果てております。どうぞ、正規表現にくわしいかた、よろしくお願いします。 一二三『一二三にそれぞれ♪マーク』 という文章に対して 一♪二♪三♪ という一括置換をすることには成功しました。 こう書いています。 ■検索文字列 (.{1,1})(.{1,1})(.{1,1})『(.{1,1})(.{1,1})(.{1,1})にそれぞれ♪マーク』 ■置換文字列 \1♪\2♪\3♪ これでぶじ、以下のように一括置換できました。 一♪二♪三♪ 現実には傍点や圏点をふっているんですが、判りやすく♪マークにしています。 この調子で長い文章も変換できていて満足していたのですが…… しかし代入文字が10個以上になったとたんに、まったく動きません。 ■置換したい文章 一二三四五六七八九十『一二三四五六七八九十にそれぞれ♪マーク』 ■検索文字列 (.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})『(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})にそれぞれ♪マーク』 ■置換文字列 \1♪\2♪\3♪\4♪\5♪\6♪\7♪\8♪\9♪\10♪ こうやると、置換後の文章は以下のようになってしまいます。 一♪二♪三♪四♪五♪六♪七♪八♪九♪一0♪ 10個目以降の数字が、正しく機能してくれません。 \10  という正規表現の書き方は 「一番目の値を参照して、それから数字の0を記入しなさい」 という意味になってしまうようです。 わたしは十番目の値を代入してほしいだけなんです。 \1 や \2 や \3 といった代入文字のように \10 や \11 を機能させる、正しい表記をご教授ください。よろしくお願いいたします。 ちなみに以下のように書いてもダメでした……。 \1\0 グーグルで1日中検索しても判りませんでした。jeditXの複数一括置換でこれをなんとかしたいのです。ご存じの方、どうぞ教えてください。よろしくおねがいします! 秀丸エディタをご利用で、正規表現にくわしい方も、ぜひヒントを出していただければと思います。

  • 秀丸の検索・置換の正規表現の最短一致の挙動が変です

    秀丸の検索または置換の正規表現の 最短一致での挙動ですが、 /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz の先頭にカーソルを置いた状態で、 (質問1) 正規表現のチェックボックスをチェックして /.*$ で検索すると /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されると思うのですが 実際には /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます。 なぜでしょうか。 (/abc/.*$とするとカーソルがある /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz ではなく次の行以降の /abc/def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます?) (質問2) 正規表現のチェックボックスをチェックして /.*?$ で検索すると最短一致となるため /uvw.xyz が検索されると思うのですが 実際には /def/ghi/jkl/mno/pqr/st/uvw.xyz が検索されてしまいます。 なぜでしょうか。 (なお、/[^/]*$では/uvw.xyzが検索されます)

  • 秀丸での、正規表現を使った置換

    秀丸での、正規表現を使った置換 \t第*.条*. (例えば「第1条」「第2条」「第3条」など) にマッチするものを、 \n第*.条*.\n のフォーマットに変換したいです。 しかし、変更後を「\n第*.条*.\n」でしていすると、 置換後の文字自体が、アスタリスクになってしまい、 例えば「第1条」「第2条」「第3条」などが、 すべて「第*.条」「第*.条」「第*.条」などになってしまいます。 数字部分を残しつつ置換するにはどうすればよいでしょうか?

  • 秀丸の正規表現を使って置換

    三番目の引数が0かNULL、nullならば、以下のように秀丸で置換したいのですが、やり方がわかりません。正規表現を使って置換したいです。 abcmethod(aaa, bbb, 0, ccc)やabcmethod(aaa, bbb, null, ccc)    ↓↓↓↓↓↓ abcmethod(aaa, bbb, ccc) aaa,bbb,cccは任意の文字半角アルファベットや数値です。 abcmethod(.+,.+,.+,.+)で、検索できますが、置換の仕方がわかりません。 どうぞよろしくお願いします。

  • (秀丸)正規表現で、特定文字列含む<~>範囲を選択

    お世話になります。 (秀丸の)正規表現について教えてください。 たとえば、テキストファイルに、1行、 ”<abc>文字列1です><abc>文字列2です><abc>文字列3です>(ここで改行)” という文字列が存在しています。 それを対象として、 (秀丸の)正規表現を利用し、 ”<abc>文字列2です>”だけをマッチさせたいのですが、 試しに、(秀丸の)正規表現で、 <abc.*文字列2.*?>  ←(なお、実際の記号は半角(.*?等)で、それぞれ入力しています・・・) で検索実行したところ、 ”<abc>文字列1です><abc>文字列2です>” として、 前の方に、マッチして欲しくない、 ”<abc>文字列1です>” までがマッチしてしまっている状況です。 そこでご質問なのですが、 上記におきまして、(秀丸の)正規表現を利用して、 ”<abc>文字列2です>”だけをマッチさせるには、 どのようにすれば、よろしかったでしょうか? (ちなみに秀丸は、2013年12月10日(火)現在の  最新バージョンVer8.32を利用しています) 以上になります。 宜しくお願いいたします。