メールアドレスをドメイン名で並び替える方法はないでしょうか。

具体的にはaaa@bbb.com,aaa@ccc.com,aaa@aaa.comなら、aaa@aaa.com、aaa@bbb.com、aaa@ccc.comに並んでほしいのです。ツールで並び替えよりsqlやvbsのスクリプトでお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/05/23 00:36:13
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tamago0141 No.5

回答回数5ベストアンサー獲得回数1

ポイント30pt

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

id:kuruma_neko

モジュールにしておけば便利そうですね。ありがとうございます。

2006/05/23 00:34:56

その他の回答4件)

id:thunder9119 No.1

回答回数24ベストアンサー獲得回数0

ポイント20pt

エクセルではダメでしょうか?

テキストに

aaa@bbb.com

aaa@ccc.com

aaa@aaa.com

と1行1行書いているものを、エクセルで読み込み。

読み込む時に「カンマやタブなどの区切り文字・・」を選択

区切り文字の「その他」にチェックをして@を入力

これで、ドメインを分離してエクセルに読み込めたので

エクセルの機能のデータの並べ替えでドメインごとに並べます。

並び替えたあと、元のテキストに戻すには

全てをコピーしてなんらかのテキストエディタに貼り付け、

タブ文字を@に置換すれば完成です。

かなり手間ですがこれしか思いつきませんでした・・

id:kuruma_neko

ありがとうございます。確認したところ、確かにうまく並び替えできました。しかし、担当者のPCスキルに依存しない運用を考えているため、基本的にバッチにして自動化したいと考えています。エクセルのマクロでもいけると思いますが、もうちょっと汎用的な方法を考えています。

2006/05/21 01:25:03
id:bash0C7 No.2

回答回数7ベストアンサー獲得回数0

ポイント30pt

正規表現で@以降を取得し並び替えを行えばいいと思います。

メールアドレスの場合、@.* という正規表現で@とドメイン部分を抜き出せます。


例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変数から@以降の文字列を取得

id:kuruma_neko

SQLがわかりやすく簡単そうでいいですね。

問題はアクセスで動かないことかな・・・。

2006/05/23 00:30:32
id:n_koji72 No.3

回答回数53ベストアンサー獲得回数1

ポイント10pt

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コマンドを

呼び出して使うことも可能だと思います。

id:kuruma_neko

Linuxは、小さなツールというかコマンドが便利という話は聞きますが、確かに便利そうですね。

現実問題として、ソートするために環境を入れるのはちょっと面倒っす。

2006/05/23 00:32:49
id:takoratta No.4

回答回数72ベストアンサー獲得回数5

ポイント10pt

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

id:kuruma_neko

なるほど、DOSバッチという手もありますね。参考になりました。

2006/05/23 00:33:38
id:tamago0141 No.5

回答回数5ベストアンサー獲得回数1ここでベストアンサー

ポイント30pt

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

id:kuruma_neko

モジュールにしておけば便利そうですね。ありがとうございます。

2006/05/23 00:34:56
  • id:kuruma_neko
    ドメイン名+アカウントでの並び替えは使用率が高そうなので、重宝します。ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません