正規表現を使用して、文字列置換を行いたいと考えています。
当方、最近の言語はあまり知らないため、将来を見据えこれからも使えるお勧め文字列置換スクリプト言語がありましたら、教えてくださいませ。
ちなみにプログラムだけはベテランの方に聞くとsed,awk等で出来ると言われましたが・・・、どうせ覚えるならモダンな言語がいいと思いまして質問させて頂きました。
捕捉:環境 windows10
Unixライクな環境は構築可能だが、出来るだけやりたくない。
やりたい事は下記の文字列置換を以下にシンブルにできる方法を模索中。
例:
元文字列
あいうえお、男、0120-1234-1111、
かきくけこ、男、0120-1234-2222、
さしすせそ、女、0120-1234-3333、
↓置換後
NO.1, 0120-1234-1111, MR.あいうえお
NO.2, 0120-1234-2222, MR.かきくけこ
NO.3, 0120-1234-3333, Mrs.さしすせそ
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/13 15:38
回答10件
0
大概のスクリプト言語は正規表現を使えるようになっていますから、正規表現を使って処理をする分にはどの言語を選んでも大差はありません。
正規表現の機能を使うにあたり、各言語毎に文法等が異なりますから、それらを含めてしっくり来るものを使えばいいのではないでしょうか。
(結局は、一度は使ってみた方がいいと思います)
ただ、業務等で使うとなると、若干状況が変わることもあります。元より、モダンなスクリプト言語を使える環境であれば、選択肢が広がりますが、そうでない場合(しかも、Unix/Linuxの環境でということになると)、使えるスクリプト言語も限られます。そのような環境の場合でもsed
、awk
、perl
はインストールされていることが多いので、その中から選ぶことになるでしょう。
(自由に言語をインストールができない環境であれば、その中から選ぶしかないです)
どの言語を選ぶのは自由ですが、どこでも使えるようなものを選ぶとなると、モダンな言語より、sed
、awk
になることが多いと思います。
(CentOSはperlの代わりにpython2系が入ってるらしいですが。それとWindowsだと、どの道どれもインストールする必要がありますが)
投稿2019/06/29 07:39
総合スコア1557
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/30 01:22
2019/07/03 05:55
2019/07/13 15:12
0
参考までに、「モダンな言語」のPythonで書いてみました。
python
1import sys 2 3honor = {"男":"MR", "女":"Mrs"} 4for i, line in enumerate(sys.stdin, start=1): 5 name, sex, tel, *_ = line.split("、") 6 print(f"NO.{i}, {tel}, {honor[sex]}.{name}") 7 8# python script_name.py < input.txt > output.txtとかで
同じようなことは大抵のスクリプト言語でできると思います。Pythonでやると、コードの見た目は可もなく不可もなくという感じで、書くのはすごく簡単なので、私はよく慣れてるPythonでやります。
csvモジュールでも書いてみた
python
1import sys 2import csv 3 4honor = {"男":"MR", "女":"Mrs"} 5for i, d in enumerate(csv.DictReader( 6 sys.stdin, ["name", "sex", "tel", "*"], delimiter="、"), start=1): 7 print(f"NO.{i}, {d['tel']}, {honor[d['sex']]}.{d['name']}")
大差ないような気も・・・
投稿2019/06/30 06:20
編集2019/06/30 07:30総合スコア30933
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/06/30 06:24
2019/06/30 07:32
2019/07/02 12:54
2019/07/13 15:25
0
やりたいことを見る限り、正規表現を使用するケースではないです
スクリプトを使用した「正規表現による置換」でもっとも手軽なのは「sed,awk」です。
アドバイスに従えば良い。
(というか、何んでアドバイスに従わないのか不明。。。)
「モダンな言語」を使用したいのであれば先に「モダンな言語」を決め打ちしてしまえば良いです。インプット/アウトプットの例を見る限りナンの言語を使用しても再構築可能です。
投稿2019/06/29 08:30
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/30 01:23
退会済みユーザー
2019/06/30 02:41
2019/07/01 01:49
2019/07/13 15:20
0
perl以後の言語でしたら、おそらく文字列に関するなんらかのサポートがあります。
選考するためのポイントとしては
- 対象文字列(ファイル)がUTF-8で与えられるか?
sjisのまま扱えるかまたは適切なエンコーディングに変換できる言語である必要があります。
- 置換速度を考慮する必要があるか?
もし、だいたい1秒以内に置換完了させる必要があるのならば
スクリプト言語は不向きなのでgo等のコンパイル言語を考えます。
- 置換を実行するマシンの環境はどうなっているか?
極端な例ですが、windowsマシンに対してsed/awkは不向きです。
また、既にインストールされている言語があるのならばそれを用いた方がよいこともあります。
これらを考慮しながらruby python php perl js go c# powershellあたりのマニュアル読むなりして
実現したい動作を実現できるか考えるといいんじゃないですかね
Ruby(ワンライナー)
shell
1ruby -Ku -ple "f=$_.split('、');$_=%(NO.#{i||=0;i+=1}, #{f[2]}, #{{'男'=>'MR.','女'=>'Mrs.'}[f[1]]}#{f[0]})" < input.txt
投稿2019/06/29 07:38
編集2019/07/01 04:46総合スコア15147
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/30 01:15
2019/06/30 01:48
2019/07/13 15:06
0
Windows 10ということを考えれば、「Unix的な環境」や個別のインストールなしに使えるスクリプト言語はほぼありません。
となれば、優先したいことによって取るべき道が変わってきます。
- 何もインストールしないことを優先したい→WSHやPowerShellを使う(ただし、他言語より資料が少ない、また使える幅も限られるなどの制約はあります)、あるいはすでに環境にあるツールを使う
- 将来を見据えこれからも使える言語を学ぶことを優先する→先に言語を選定して、その環境を構築する
投稿2019/07/01 02:04
総合スコア145183
0
ベストアンサー
何を以て「モダン」と定義するのか知りませんが、私の結論を言わせてもらうなら、質問の案件に関する限りperlが第1候補ですね。次点がawkです。
「正規表現」自体は多くの言語で利用することができます。しかし正規表現だけでやりたいことをすべてカバーできることは稀です。質問のケースにおいても、行番号での置換などは正規表現だけではカバーできません。テキストの加工に関しては、豊富な機能と柔軟なコーディングスタイルをサポートし、限りなくsedに近いたかだか数文字の極少ワンライナーから数千行におよぶ本格的なツール構築にまで対応できる点で、perlを超えるものは見当たらないですね。古いとか見にくいとか言っている人たちがいますが、そんな批判は当たりません。
試しにスクリプトを書いてみました。
sed
# test.sed s/([^、]*、)男/\1MR./ s/([^、]*、)女/\1Mrs./ s/([0-9]*)\t(.*?)、(.*?)、(.*?)、/NO.\1,\3\2,\4/
sedでは変数をスクリプトの中で自由に使うことができないので工夫が必要になります。とくに行番号の取り込みはsedだけでは難しく、他のツールの助けを借りることになるでしょう。この点で少なくとも当案件に関してはsedは手軽とは言いにくいように思います。
対象データがutf-8のテキストとしてinput.txtに格納されていると仮定すれば、次のような感じになるでしょう。行番号の付加にnlの助けを借りています。
nl input.txt | sed -r -f test.sed > output.txt
awk
# test.awk match($0, /(.*?)、(.*?)、(.*?)、/, a){ printf("NO.%d,%s,%s%s\n", NR, a[3], ( a[2]=="男")?"MR.":"Mrs.", a[1]); }
sed版に寄せて、全体を正規表現で処理するように書いてみました。しかし、私が実際にやるとすれば、、
をフィールドセパレータとしてまず文字列を分割してから、それぞれを処理する流れにすると思います。
変数と三項演算子が使えるので、他のツールを援用する必要もなく、sedの回りくどさがありません。
awk -f test.awk input.txt > output.txt
perl
use strict; use warnings; use utf8; binmode STDOUT, ':utf8'; binmode STDIN, ':utf8'; while(<STDIN>){ /(.*?)、(.*?)、(.*?)、/ and printf("NO.%d,%s,%s%s\n", $., $3, ($2 eq '男')?'MR.':'Mrs.', $1); }
他にいろいろやりようはあると思いますが、前掲のスクリプトと比較しやすいであろう形で書いてみました。
この範囲ではawkに比べるとやや冗長な感じが出てしまいます。しかし、これ以上処理の内容が複雑化するならばperlのありがたみを噛みしめることになるでしょう。
perl test.pl < input.txt > output.txt
投稿2019/06/29 23:35
総合スコア13671
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/30 02:06
2019/07/13 15:51
0
文字列を置換するだけであれば、エディターのマクロでもできます。
// // 秀丸マクロ // Init: // データファイルハンドルを取得する #HWND = hidemaruhandle(0); newfile; // 結果保存先 #HWND_NEW = hidemaruhandle(0); setactivehidemaru #HWND; // データファイルに戻る // #c1 = 0; #c2 = 256; #l1 = 1; #l2 = 1; Main: while(1) { $pok = gettext2(#c1, #l1, #c2, #l2, 0); if (strlen($pok) == 0) break; setactivehidemaru #HWND_NEW; $no = str(#l1); call Split $pok, "、", 0; // call Split $pok, ",", 0; // message str(##return); if (##return > 2) { $name = $Spl[0]; $sex = $Spl[1]; $tel = $Spl[2]; if ($sex == "男") { $sex = "MR."; } else { $sex = "Mrs."; } insert "No." + $no + "," + $tel + "," + $sex + $name+ "\n"; } setactivehidemaru #HWND; // 次の行へ #l1 = #l1 + 1; #l2 = #l1; } End: endmacro; // 秀丸マクロには、Split系の関数が存在しないので自作する Split: $$str = $$1; $$fnd = $$2; ##end = ##3; ##fnd_len = strlen($$fnd); ##i = 0; ##cnt = 0; if (strstr($$str,$$fnd) > -1){ while( ##i < strlen($$str) ) { if (midstr($$str, ##i, ##fnd_len) == $$fnd) { $Spl[##cnt] = midstr($$str, ##start, ##i - ##start); ##start = ##i + ##fnd_len; ##cnt = ##cnt + 1; } ##i = ##i + 1; } $$estr = midstr($$str, ##start); if (strlen($$estr) == 0) { if (##end) { $Spl[##cnt] = $$estr; } } else { $Spl[##cnt] = $$estr; ##cnt = ##cnt + 1; } } return ##cnt;
実際に実装してみて、pythonやrubyの方が簡単にできますね。
投稿2019/07/02 12:40
編集2019/07/02 12:44総合スコア338
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/13 15:31
2019/07/14 13:53
0
awkの奥の深さ、sedのお手軽さに、打ちひしがれる日が必ずくるのに、真っ当な技術者であればあるほどに。
投稿2019/06/29 09:52
総合スコア6142
0
perl . ruby , python で実装可能です。
linux をインストールしなくてもそれぞれ単体で
言語をwindowsマシンにインストールできます。
VS CODE をインストールして
正規表現のプラグインを インストールして
コーディングすれば実装は30分もあればできるでしょう
投稿2019/07/08 00:37
総合スコア1015
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。