具体的にはaaa@bbb.com,aaa@ccc.com,aaa@aaa.comなら、aaa@aaa.com、aaa@bbb.com、aaa@ccc.comに並んでほしいのです。ツールで並び替えよりsqlやvbsのスクリプトでお願いします。
VBScriptでもできますが、Excel VBAの方が良いかと思います。
MailAddress.txt
------------------------------
aaa@bbb.com
aaa@ccc.com
aaa@aaa.com
aaa@fff.com
aaa@eee.com
aaa@hhh.com
aaa@ggg.com
aaa@iii.com
aaa@ddd.com
------------------------------
Excel VBAコード
------------------------------------------------------------
Sub SortMailAddress()
Dim myFile As String
Dim myRow As Long
myFile = Application _
.GetOpenFilename("テキスト・ファイル(*.txt), *.txt")
Workbooks.Open (myFile)
With ActiveSheet
myRow = 1
Do Until .Cells(myRow, 1) = ""
.Cells(myRow, 2) = Mid(.Cells(myRow, 1), _
InStr(1, .Cells(myRow, 1), "@") + 1, _
Len(.Cells(myRow, 1)) - InStr(1, _
.Cells(myRow, 1), "@"))
myRow = myRow + 1
Loop
Columns("A:B").Sort Range("B1"), _
xlAscending, header:=xlNo
Columns("B").Delete
End With
End Sub
------------------------------------------------------------
Excelを起動させ、シートタブを右クリックし、「コードの表示」左クリックして、ツールバーの「挿入」の「標準モジュール」を左クリックして、上記のExcel VBAコードを右側の空白に貼り付けてください。
次に、ツールバーの「ファイル」の「終了」を左クリックしてください。
これで、ツールバーの「ツール」の「マクロ」の「マクロ」を左クリックし、「実行」ボタンを左クリックし、上記のテキスト・ファイルを選択し、「開く」ボタンを左クリックすれば、OKです。
とりあえず、私のPC環境では動きましたが、エラー処理はしていません。
Windows XP Pro. SP2
Excel 2000
エクセルではダメでしょうか?
テキストに
aaa@bbb.com
aaa@ccc.com
aaa@aaa.com
と1行1行書いているものを、エクセルで読み込み。
読み込む時に「カンマやタブなどの区切り文字・・」を選択
区切り文字の「その他」にチェックをして@を入力
これで、ドメインを分離してエクセルに読み込めたので
エクセルの機能のデータの並べ替えでドメインごとに並べます。
並び替えたあと、元のテキストに戻すには
全てをコピーしてなんらかのテキストエディタに貼り付け、
タブ文字を@に置換すれば完成です。
かなり手間ですがこれしか思いつきませんでした・・
ありがとうございます。確認したところ、確かにうまく並び替えできました。しかし、担当者のPCスキルに依存しない運用を考えているため、基本的にバッチにして自動化したいと考えています。エクセルのマクロでもいけると思いますが、もうちょっと汎用的な方法を考えています。
正規表現で@以降を取得し並び替えを行えばいいと思います。
メールアドレスの場合、@.* という正規表現で@とドメイン部分を抜き出せます。
例1:Oracle10gでHOGEテーブルのMAILADDRESSフィールドにメールアドレスが入っている場合のドメインで並び替えSQL
select * from HOGE order by REGEXP_SUBSTR(MAILADDRESS,'@.*'); --MAILADDRESSフィールドに格納している@以降の文字列を正規表現関数で取得し、並び替え条件としている
例2:VBSでMailAddress変数から@以降の文字列を取得
Set re = New RegExp '1.正規表現ライブラリのインスタンス作成
re.Pattern = "@.*" '2.@以降を取得するように指定
re.Execute(MailAddress).(1) '3.MailAddress変数から@以降の文字列を取得
SQLがわかりやすく簡単そうでいいですね。
問題はアクセスで動かないことかな・・・。
Linuxならsortコマンドで一発なんですが...
初めの回答のように縦にアドレスが並んだテキストファイルをbefore.txtとすると,
$ sort -t'@' -k2,2 before.txt > after.txt
でソートされた結果がafter.txtに保存されます。
MacOSXでも同様のsortコマンドがあるはずです。
Windowsのコマンドプロンプトのsortでは無理なので,
Cygwinをインストールして上記sortが使えるようにする必要があります。
http://journal.mycom.co.jp/special/2002/cygwin/
一度インストールしておけば,
Windowsのバッチファイルからこのsortコマンドを
呼び出して使うことも可能だと思います。
Linuxは、小さなツールというかコマンドが便利という話は聞きますが、確かに便利そうですね。
現実問題として、ソートするために環境を入れるのはちょっと面倒っす。
Windowsのバッチコマンドでもできそうです。forとsortを組み合わせて。
@echo off
if "%1" == "" goto error
if "%2" == "" goto error
set tempfile=%temp%\domsorttemp.txt
if exist %tempfile% del %tempfile%
if not exist "%1" goto error
if exist "%2" del "%2"
for /f "usebackq delims=@ tokens=1,2" %%a in ("%1") do echo %%b %%a@%%b >> %tempfile%
for /f "tokens=2 " %%a in ('sort %tempfile%') do echo %%a >> "%2"
del %tempfile%
goto end
:error
echo 引数が足りません。または、入力ファイルがありません。
echo usage: domsort 入力ファイル 出力ファイル
:end
なるほど、DOSバッチという手もありますね。参考になりました。
VBScriptでもできますが、Excel VBAの方が良いかと思います。
MailAddress.txt
------------------------------
aaa@bbb.com
aaa@ccc.com
aaa@aaa.com
aaa@fff.com
aaa@eee.com
aaa@hhh.com
aaa@ggg.com
aaa@iii.com
aaa@ddd.com
------------------------------
Excel VBAコード
------------------------------------------------------------
Sub SortMailAddress()
Dim myFile As String
Dim myRow As Long
myFile = Application _
.GetOpenFilename("テキスト・ファイル(*.txt), *.txt")
Workbooks.Open (myFile)
With ActiveSheet
myRow = 1
Do Until .Cells(myRow, 1) = ""
.Cells(myRow, 2) = Mid(.Cells(myRow, 1), _
InStr(1, .Cells(myRow, 1), "@") + 1, _
Len(.Cells(myRow, 1)) - InStr(1, _
.Cells(myRow, 1), "@"))
myRow = myRow + 1
Loop
Columns("A:B").Sort Range("B1"), _
xlAscending, header:=xlNo
Columns("B").Delete
End With
End Sub
------------------------------------------------------------
Excelを起動させ、シートタブを右クリックし、「コードの表示」左クリックして、ツールバーの「挿入」の「標準モジュール」を左クリックして、上記のExcel VBAコードを右側の空白に貼り付けてください。
次に、ツールバーの「ファイル」の「終了」を左クリックしてください。
これで、ツールバーの「ツール」の「マクロ」の「マクロ」を左クリックし、「実行」ボタンを左クリックし、上記のテキスト・ファイルを選択し、「開く」ボタンを左クリックすれば、OKです。
とりあえず、私のPC環境では動きましたが、エラー処理はしていません。
Windows XP Pro. SP2
Excel 2000
モジュールにしておけば便利そうですね。ありがとうございます。
モジュールにしておけば便利そうですね。ありがとうございます。