- ベストアンサー
(秀丸)正規表現で、CSV内金額へ消費税計算置換
- 正規表現を使用してCSVテキストファイル内の金額を消費税計算に置換する方法について教えてください。
- CSVテキストファイルの中に含まれる金額を正規表現で抽出し、消費税を計算して置換する方法についてお伺いします。
- (秀丸の)正規表現を利用して、CSVテキストファイル内の金額を消費税計算に置換する方法を教えてください。
- みんなの回答 (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円未満は切り捨てています。
その他の回答 (4)
- tatsu99
- ベストアンサー率52% (391/751)
#3です。 今、業務中ですので、申し訳ありませんがperlでの回答は今日の夜になります。 1点質問ですが、 >一部修正(ダブルコーティションではなくて、`文字で全ての各フィールドを囲っている) となっていますが、 `文字は、本当にバッククオート(shift+@)ですか、 それとも、シングルクオート(shift+7)ですか、 あなたの提示された`文字は、バッククオートですが、 通常、バッククオートで、くくることはないので、念のための確認です。
補足
ご質問の件ですが、 「バッククオート(shift+@)」 で、全ての各フィールドを囲っていました。 phpMyAdminで、MySQLのテーブルを CSVファイルとして、エクスポートした際に、 「フィールド囲み記号」として、 `文字(バッククオート(shift+@))で、 指定していた為でした。 PS: perlでの回答を今日の夜にいただけるとのこと、 本当にありがとうございます。 いただきましてから、 おそらく明日になるかと存じますが早々に動かしてみます。 以上、宜しくお願いいたします。
- tatsu99
- ベストアンサー率52% (391/751)
本件ですが、秀丸のマクロで処理するには、荷が重過ぎるようです。 #2の方がいわれているように、excelで処理するか、perl,ruby等で処理するほうが、楽かと思います。 もし、perlまたはrubyで行うならば、まず、perlまたはrubyをあなたのマシンにインストール する必要があります。 もし、インストールを行ってでも、perl又はrubyで本件を解決したいと望まれるなら、 perl又はrubyの本件を処理するスクリプトを私のほうで提示することは、可能です。 その場合は、インストール完了後にその旨、補足ください。 (その際、perl又はrubyのバージョンもご提示ください。)
補足
お世話になります。 コメントありがとうございます。 たまたまActivePerl Ver5.14.2(Windows7 32bit環境内)が、 私のパソコンにインストール済でした。 お手数をおかけいたしますが、 もしPerlのスクリプトをご提示いただけるようでしたら、 ぜひお願いいたします。 (ご提示いただき次第、本日出来るだけ早急に動かして試してみます) なお、 先ほど、私の方で補足といたしまして、 一部修正(ダブルコーティションではなくて、`文字で全ての各フィールドを囲っている)と、 1~3ケタ以内の金額には、カンマが付いていないケースもあることを 追記させていただいておりますので、 あわせて、宜しくお願いいたします。
- ralf124c
- ベストアンサー率52% (232/446)
たびたびすいません もしかして正規表現でなくマクロの話でしょうか? 正規表現で数字部分をマッチさせるも全体はマクロで処理云々ということでしょうか? CSVならExcelでやった方が早くないですか?
お礼
いつもお世話になっております。 前回も教えていただき助かりました。 今回も、秀丸の正規表現で演算が出来ないことに 気づかせていただいたり、Excelを利用する発想など、 アドバイスいただきまして、大変勉強になりました。 本当にありがとうございました。
補足
お世話になります。 コメントありがとうございます。 私は最近正規表現を始めたばかりで、 よく理解していない為、ちんぷんかんぷんな ご質問をしてしまっているのかもしれません。 目的は、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)
逆に質問で申し訳ないのですが正規表現で演算ってできましたっけ?
お礼
早々にPerlスクリプトをご回答いただきましたので、 さっそく動かしてみたところ、 ご提示いただきましたoutput.txtの内容と 同じ内容のテキストが正常に出力されました。 本当に助かりました。 ありがとうございました。