お世話になります。
(秀丸の)正規表現について教えてください。
たとえば、CSVテキストファイルに、1行、
ABC,DEF,"10,000円","10,500円",GHI
という文字列が存在しています。
そこでご質問なのですが、
(秀丸の)正規表現を利用し、
上記"10,000円"の文字列を、
10000と判断させて、その数値に対して1.08掛け算して(8%消費税を加算して、)
右となりの、上記"10,500円"を、"10,800円"と変更して置換したいです。
(ちなみに秀丸は、2013年12月16日(月)現在の
最新バージョンVer8.32を利用しています)
以上になります。
宜しくお願いいたします。
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円未満は切り捨てています。
早々にPerlスクリプトをご回答いただきましたので、
さっそく動かしてみたところ、
ご提示いただきましたoutput.txtの内容と
同じ内容のテキストが正常に出力されました。
本当に助かりました。
ありがとうございました。
No.4
- 回答日時:
#3です。
今、業務中ですので、申し訳ありませんがperlでの回答は今日の夜になります。
1点質問ですが、
>一部修正(ダブルコーティションではなくて、`文字で全ての各フィールドを囲っている)
となっていますが、
`文字は、本当にバッククオート(shift+@)ですか、
それとも、シングルクオート(shift+7)ですか、
あなたの提示された`文字は、バッククオートですが、
通常、バッククオートで、くくることはないので、念のための確認です。
この回答への補足
ご質問の件ですが、
「バッククオート(shift+@)」
で、全ての各フィールドを囲っていました。
phpMyAdminで、MySQLのテーブルを
CSVファイルとして、エクスポートした際に、
「フィールド囲み記号」として、
`文字(バッククオート(shift+@))で、
指定していた為でした。
PS:
perlでの回答を今日の夜にいただけるとのこと、
本当にありがとうございます。
いただきましてから、
おそらく明日になるかと存じますが早々に動かしてみます。
以上、宜しくお願いいたします。
No.3
- 回答日時:
本件ですが、秀丸のマクロで処理するには、荷が重過ぎるようです。
#2の方がいわれているように、excelで処理するか、perl,ruby等で処理するほうが、楽かと思います。
もし、perlまたはrubyで行うならば、まず、perlまたはrubyをあなたのマシンにインストール
する必要があります。
もし、インストールを行ってでも、perl又はrubyで本件を解決したいと望まれるなら、
perl又はrubyの本件を処理するスクリプトを私のほうで提示することは、可能です。
その場合は、インストール完了後にその旨、補足ください。
(その際、perl又はrubyのバージョンもご提示ください。)
この回答への補足
お世話になります。
コメントありがとうございます。
たまたまActivePerl Ver5.14.2(Windows7 32bit環境内)が、
私のパソコンにインストール済でした。
お手数をおかけいたしますが、
もしPerlのスクリプトをご提示いただけるようでしたら、
ぜひお願いいたします。
(ご提示いただき次第、本日出来るだけ早急に動かして試してみます)
なお、
先ほど、私の方で補足といたしまして、
一部修正(ダブルコーティションではなくて、`文字で全ての各フィールドを囲っている)と、
1~3ケタ以内の金額には、カンマが付いていないケースもあることを
追記させていただいておりますので、
あわせて、宜しくお願いいたします。
No.2
- 回答日時:
たびたびすいません
もしかして正規表現でなくマクロの話でしょうか?
正規表現で数字部分をマッチさせるも全体はマクロで処理云々ということでしょうか?
CSVなら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ですので、
ご質問内容を実現する方法がございましたら、
ぜひ教えてください。
宜しくお願いいたします。
いつもお世話になっております。
前回も教えていただき助かりました。
今回も、秀丸の正規表現で演算が出来ないことに
気づかせていただいたり、Excelを利用する発想など、
アドバイスいただきまして、大変勉強になりました。
本当にありがとうございました。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) テキストエディタで複数行にわたる文字列の行頭に番号を振る方法 4 2023/03/11 12:57
- 日本株 SBIのHPに手数料は100万円まで無料だと書かれているのですが、、、。何故でしょうか。 1 2022/04/04 20:48
- 格安スマホ・SIMフリースマホ 今 ahamoを使っていて 4898円以下になる携帯会社があれば乗り換えたいです 20GBと24時間 9 2022/09/27 07:43
- オープンソース csvデータのダブルクォーテーションで囲まれた文字内にあるカンマを削除したい 3 2022/09/02 15:17
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- 消費税 消費税の納税額の計算 1 2023/02/19 18:12
- 所得税 扶養範囲内で働く事について130万円以内の場合 3 2022/09/12 22:51
- 政治 日本のODA(政府開発援助)金について。 5 2023/06/19 21:41
- フリーソフト サクラエディタの正規表現(grep機能)の使い方 3 2022/06/22 10:29
- 所得税 どなたかこの問題わかる方教えてください。よろしくお願いします。 所得税の計算体系を示したのち、所得税 3 2023/01/13 16:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
40代後半でゼロからのプログラ...
-
正規表現 URL抽出「 [\\/\\b]{0...
-
AIの登場でプログラマーたちが...
-
IIS+ASP.NETでForms認証中の設定
-
vba クリップボードクリアにつ...
-
過剰なオブジェクト指向脳から...
-
VBAでパワーシェルを実行したい...
-
恒久的リダイレクトについて
-
16x16のスプライトフォント
-
.htaccessの設定で、httpはhttp...
-
プログラミング未経験者(殆ど未...
-
小学1年生の子です。塾に行かせ...
-
ExcelVBAでFormulaR1C1を列範囲...
-
IT業界より楽に稼げる業界って...
-
htaccessで特定のディレクトリ...
-
GoogleAppsScript文字列置換の...
-
楽しくて最高のプログラミング...
-
プログラミング
-
テキストファイルのファイル名...
-
Windowsのアプリ開発ってなんの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XPathでのワイルドカード指定
-
perlのgrepで日本語の処理でエ...
-
perl で 64ビットint を扱うには?
-
漢字、カタカナ、ひらがな、英...
-
Excel VBAでリンク切れをチェッ...
-
Excel VBA 定義されたプロージ...
-
例外処理のフローチャートの記...
-
ArduinoのジャイロモジュールMP...
-
ユーザー定義関数に#NAME?が返...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
エクセルVBAでシートモジュール...
-
Excel VBA 『Call』で呼び出す...
-
LCD ディスプレイを Raspberry ...
-
ハマったので助けて~。Apache...
-
モジュールとは何ですか
-
VBA This Workbookモジュール...
-
VBでグローバル変数を宣言するには
-
グラフのX,Y座標を取得したい
-
VBAで旧字体を異字体に一括で変...
おすすめ情報