みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

(秀丸)正規表現で、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を利用しています)

以上になります。
宜しくお願いいたします。

投稿日時 - 2013-12-16 23:55:53

QNo.8389335

すぐに回答ほしいです

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

#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円未満は切り捨てています。

投稿日時 - 2013-12-17 20:08:35

お礼

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

投稿日時 - 2013-12-17 22:41:32

ANo.5

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

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

あなたの提示された`文字は、バッククオートですが、
通常、バッククオートで、くくることはないので、念のための確認です。

投稿日時 - 2013-12-17 16:15:53

補足

ご質問の件ですが、
「バッククオート(shift+@)」
で、全ての各フィールドを囲っていました。

phpMyAdminで、MySQLのテーブルを
CSVファイルとして、エクスポートした際に、
「フィールド囲み記号」として、
`文字(バッククオート(shift+@))で、
指定していた為でした。

PS:
perlでの回答を今日の夜にいただけるとのこと、
本当にありがとうございます。
いただきましてから、
おそらく明日になるかと存じますが早々に動かしてみます。

以上、宜しくお願いいたします。

投稿日時 - 2013-12-17 16:50:11

ANo.3

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

投稿日時 - 2013-12-17 15:32:02

補足

お世話になります。
コメントありがとうございます。

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

投稿日時 - 2013-12-17 15:44:07

ANo.2

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

投稿日時 - 2013-12-17 14:37:56

補足

お世話になります。
コメントありがとうございます。

私は最近正規表現を始めたばかりで、
よく理解していない為、ちんぷんかんぷんな
ご質問をしてしまっているのかもしれません。

目的は、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ですので、
ご質問内容を実現する方法がございましたら、
ぜひ教えてください。
宜しくお願いいたします。

投稿日時 - 2013-12-17 15:34:19

お礼

いつもお世話になっております。
前回も教えていただき助かりました。

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

投稿日時 - 2013-12-17 22:47:13

ANo.1

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

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

投稿日時 - 2013-12-17 14:28:28

あなたにオススメの質問