データベースの中から「団体の名称」と「電話番号」だけ抜き出したいのですが可能でしょうか?


文字や項目がキレイに整っているなデータベースではなく、
縦が4行ぐらいのデータが多く
横の文字数がデータによってばらつきがあります。

使用できるソフトはexcelとtxtとします。
データベースはtxt形式です。

<例>

36

82優生○○○改悪○○会
   東京都○○市荒木門町64-4  ○○内
0*-3**3-**74

37
NGO○○準備会

38
国際○○情報センター (住所非公開)
*3-5**5-**88

基本的には「1行目・・・データ番号」「2行目・・・名称」「3行目・・・住所」
「4行目・・・電話番号」+1行空白、というデータが多いです。
何千もデータがあり、とても手作業ではこなせません。。。

もし名称と電話番号だけ抽出するのが難しいようでしたら、
電話番号だけでも構いません。

どうぞよろしくお願い致します。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/10/04 16:20:56
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:SALINGER No.2

回答回数3454ベストアンサー獲得回数969

ポイント150pt

ExcelVBAでテキストからデータを取り出すマクロを作ってみました。


ExcelVBAを使ったことがなければ以下を参考にしてみてください。

http://www.officepro.jp/excelvba/ini/index1.html

http://www.officepro.jp/excelvba/ini/index2.html

http://www.officepro.jp/excelvba/ini/index3.html


データ番号は1番から通し番号がついているとします。

データ番号、名称、(いろいろ)、電話番号の順番になっているとします。

間に空白行とかがあっても大丈夫です。

以下のマクロを貼り付けて、テキストファイルのパスを直して、実行すると

シートのA列に名称、B列に電話番号を抽出します。


Sub Macro()
    ' データファイルのパスを指定
    Const FILENAME = "C:\Documents and Settings\hogehoge\デスクトップ\hatena\test.txt"
    Dim FSO
    Dim TS
    Dim str As String
    Dim i As Long
    Dim f As Boolean
    Dim Meisyou As String
    Dim RE
    Dim reMatch
    
    Set RE = CreateObject("VBScript.RegExp")
    RE.Pattern = "\d{1,4}?-\d{1,4}?-\d{1,4}"
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set TS = FSO.OpenTextFile(FILENAME, 1)
    i = 1
    Do Until TS.AtEndOfStream
        str = TS.ReadLine
        If f Then
            If str = CStr(i + 1) Then
                Cells(i, 1).Value = Meisyou
                
                Meisyou = ""
                i = i + 1
            Else
                If str <> "" Then
                    If Meisyou = "" Then
                        Meisyou = Trim(str)
                    Else
                        Set reMatch = RE.Execute(str)
                        If reMatch.Count > 0 Then
                            Cells(i, 1).Value = Meisyou
                            Cells(i, 2).Value = reMatch(0)
                            
                            Meisyou = ""
                            f = False
                            i = i + 1
                        End If
                    End If
                End If
            End If
        Else
            If str = CStr(i) Then
                f = True
            End If
        End If
    Loop
    
    TS.Close
    Set TS = Nothing
    Set FSO = Nothing
    Set RE = Nothing
End Sub
id:MAYARAN

ご回答ありがとうございます!

・・・すごいですね。。。私には全く理解不能なレベルです(^-^;

わざわざすいません。感謝しております。

「テキストファイルのパスを直して」という部分なのですが

これはどのような操作を行なえばよろしいのでしょうか?

試しにテキストのデータ名+拡張子名を入力してみたのですが、

「パスが見つかりません」と表示されてしまいます。。。

「使用できるソフトはエクセルとテキスト」と記載しましたが

私個人が使用できるということではなく、

私の使っている環境がエクセルとソフトを使える、というレベルでして・・・

でも記載していただいたページの説明は非常に分かりやすく丁寧でした。

探していただいてありがとうございます。

お手すきの際にご回答いただけるとうれしいです。

2008/10/04 11:08:30

その他の回答2件)

id:hiko3karasu No.1

回答回数1058ベストアンサー獲得回数25

ポイント150pt

じゃあ、txtを取り込んでA列にデータが入っているとします。

B列を計算用に使います

B1に1

B2に

=IF(A2=A$1+SUM(B$1:B1),1,"")

B3以降にB2をコピーしてください。

C1に

=IF(B1=1,A1,"")

D1に

=IF($B2=1,"",IF($B1=1,$A2,""))

E1に

=IF(D1="","",IF($B3=1,"",IF($B1=1,$A3,"")))

F1に

=IF(E1="","",IF($B4=1,"",IF($B1=1,$A4,"")))

といれて、それぞれ、下の行にコピーします。

C列からF列を選択して「コピー」を選んで、別のシートで「形式を選択して貼り付け」を選んで「値」を選んで貼り付けてください。

データ番号の列で並べ替えをすると番号順のデータができると思います。

4番目の列に電話番号があると思います。

4行でないデータは違うところに電話番号があると思います。

 

 

また、電話番号だけ出せばいいのならば、

txtを取り込んでA列にデータが入っている時に並べ替えを行って、0から始まっている番号が電話番号になると思いますがどうでしょう?

id:MAYARAN

ご回答ありがとうございます!

原理は理解出来ませんが、指示通りにやってみるとそのようにデータが整理されました。

他のシートに貼り付けたら全てリスト化されました。

お忙しい中、貴重なお時間を使っていただいてありがとうございます。

「それぞれ、下の行にコピーします。」

の点なんですが、これはB1、B2、C1、D1、E1、F1のセルを選択して

その他のデータ番号のセルに貼り付けていくということでしょうか?

これは・・・何千の貼り付けを手作業しなければいけませんか??

それともオートでできる機能があるのでしょうか?

無知で申し訳ありません。どうぞご教授ください。。。

2008/10/04 10:55:44
id:SALINGER No.2

回答回数3454ベストアンサー獲得回数969ここでベストアンサー

ポイント150pt

ExcelVBAでテキストからデータを取り出すマクロを作ってみました。


ExcelVBAを使ったことがなければ以下を参考にしてみてください。

http://www.officepro.jp/excelvba/ini/index1.html

http://www.officepro.jp/excelvba/ini/index2.html

http://www.officepro.jp/excelvba/ini/index3.html


データ番号は1番から通し番号がついているとします。

データ番号、名称、(いろいろ)、電話番号の順番になっているとします。

間に空白行とかがあっても大丈夫です。

以下のマクロを貼り付けて、テキストファイルのパスを直して、実行すると

シートのA列に名称、B列に電話番号を抽出します。


Sub Macro()
    ' データファイルのパスを指定
    Const FILENAME = "C:\Documents and Settings\hogehoge\デスクトップ\hatena\test.txt"
    Dim FSO
    Dim TS
    Dim str As String
    Dim i As Long
    Dim f As Boolean
    Dim Meisyou As String
    Dim RE
    Dim reMatch
    
    Set RE = CreateObject("VBScript.RegExp")
    RE.Pattern = "\d{1,4}?-\d{1,4}?-\d{1,4}"
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set TS = FSO.OpenTextFile(FILENAME, 1)
    i = 1
    Do Until TS.AtEndOfStream
        str = TS.ReadLine
        If f Then
            If str = CStr(i + 1) Then
                Cells(i, 1).Value = Meisyou
                
                Meisyou = ""
                i = i + 1
            Else
                If str <> "" Then
                    If Meisyou = "" Then
                        Meisyou = Trim(str)
                    Else
                        Set reMatch = RE.Execute(str)
                        If reMatch.Count > 0 Then
                            Cells(i, 1).Value = Meisyou
                            Cells(i, 2).Value = reMatch(0)
                            
                            Meisyou = ""
                            f = False
                            i = i + 1
                        End If
                    End If
                End If
            End If
        Else
            If str = CStr(i) Then
                f = True
            End If
        End If
    Loop
    
    TS.Close
    Set TS = Nothing
    Set FSO = Nothing
    Set RE = Nothing
End Sub
id:MAYARAN

ご回答ありがとうございます!

・・・すごいですね。。。私には全く理解不能なレベルです(^-^;

わざわざすいません。感謝しております。

「テキストファイルのパスを直して」という部分なのですが

これはどのような操作を行なえばよろしいのでしょうか?

試しにテキストのデータ名+拡張子名を入力してみたのですが、

「パスが見つかりません」と表示されてしまいます。。。

「使用できるソフトはエクセルとテキスト」と記載しましたが

私個人が使用できるということではなく、

私の使っている環境がエクセルとソフトを使える、というレベルでして・・・

でも記載していただいたページの説明は非常に分かりやすく丁寧でした。

探していただいてありがとうございます。

お手すきの際にご回答いただけるとうれしいです。

2008/10/04 11:08:30
id:SALINGER No.3

回答回数3454ベストアンサー獲得回数969

ポイント150pt

データ番号が全角、最初が1以外、途中抜けてても対応。

ただし、名称や住所、電話番号に数値だけがあると、それもデータ番号と認識してしまう欠点があります。

Sub Macro()
    ' データファイルのパスを指定
    Const FILENAME = "C:\Documents and Settings\hogehoge\デスクトップ\hatena\test.txt"
    Dim FSO
    Dim TS
    Dim str As String
    Dim i As Long
    Dim f As Boolean
    Dim Meisyou As String
    Dim RE
    Dim reMatch
    
    Set RE = CreateObject("VBScript.RegExp")
    RE.Pattern = "\d{1,4}?-\d{1,4}?-\d{1,4}"
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set TS = FSO.OpenTextFile(FILENAME, 1)
    i = 1
    Do Until TS.AtEndOfStream
        str = TS.ReadLine
        If f Then
            If IsNumeric(str) Then
                Cells(i, 1).Value = Meisyou
                
                Meisyou = ""
                i = i + 1
            Else
                If str <> "" Then
                    If Meisyou = "" Then
                        Meisyou = Trim(str)
                    Else
                        Set reMatch = RE.Execute(str)
                        If reMatch.Count > 0 Then
                            Cells(i, 1).Value = Meisyou
                            Cells(i, 2).Value = reMatch(0)
                            
                            Meisyou = ""
                            f = False
                            i = i + 1
                        End If
                    End If
                End If
            End If
        Else
            If IsNumeric(str) Then
                f = True
            End If
        End If
    Loop
    
    TS.Close
    Set TS = Nothing
    Set FSO = Nothing
    Set RE = Nothing
    MsgBox "終了"
End Sub
id:MAYARAN

すごい!何千もあったデータが全部リストに・・・(T_T)

ありがとうございます!

半分ほど電話番号の代わりに住所の番地が記載されているのですが

これで5000程度のリストを得ることができました。

・・・この住所の番地が表示されてしまっている分のデータは

マクロではどうにもならない部分なんでしょうか?

私に知識があればもう少し突っ込んだ質問ができるのですが・・・

2008/10/04 14:31:43
  • id:hiko3karasu
    この前の続きですね。
    82優生○○○改悪○○会
    の82ってデータ番号?それとも名称の一部でしょうか?
    データ番号は連続していますか?
  • id:MAYARAN
    引き続きありがとうございます!
    そこの82というのは特にデータ番号ではなく、名称の一部のようです。
    データ番号は36、37、38、~とずっと続いています。
  • id:SALINGER
    電話番号は正規表現で判別できるとして、問題は名所と住所をどうやって区別するか。
    データ番号のすぐ後の行に名称が必ず来るのならば可能ですが、名称が無くて住所だけというデータがあると不可能です。
    必ず、データ番号の後に名称があるでしょうか?
  • id:MAYARAN
    引き続きありがとうございます!
    正確には・・・

    2715
    「大人の○○」
    ○○件○○市○○○78-1
    0**5-*6-8**3

    2716

    のように、1行目は番号、2行目は半角スペース1個+名称~、のように
    2行目以降は半角スペースが1個入ります。
    その後に1行空白が入り番号、以下は同様なものが多いです。
    もし名称無しで住所のみでしたら、その番号のデータはあきらめます。。。

    また、上記のようなパターンのものがずっと続いているわけではなく
    途中に3行の空白がある部分や、変なデータが入っていることがあるのですが
    これはクリアできますでしょうか? 手作業で作業したほうがよろしいですか?


    気になるのが電話番号で、042-***-****のようなものや
    03-****-****、0234-**-****などとハイフンの付く位置や文字数が
    市外局番によって異なっているのですが、こちらはクリアできる問題でしょうか?

    説明が的を得ず、申し訳ありません。
    分からない点はご質問いただければと思います。
    よろしくお願いします!




  • id:hiko3karasu
    そうなんです。
     
    36
     
    82優生○○○改悪○○会
       東京都○○市荒木門町64-4  ○○内
    0*-3**3-**74
     
    これは困る。
    たくさんあります?
  • id:MAYARAN
    2715
    「大人の○○」
    ○○件○○市○○○78-1
    0**5-*6-8**3

    2716

    ※2~4行目の半角スペースが再現できていません・・・

    のような、4行完結の形式が多いので、
    その他の形式のものは無視しようと思ってます。
  • id:aki1960
    以前の質問も拝見させていただきましたが、目的を実現するのにツールを限定する必要はないのでは?
    perlでちょこっとプログラムを書けばかなり高精度に変換できますし、何日も悩んで時間を潰すよりは、できる人に頼んじゃうって手も検討された方が良いのでは?
    もちろんperlでなくても言語はなんでもいいけど。
    できる人が見つかれば、たぶん半日もあれば解決できますよ。
  • id:MAYARAN
    コメントありがとうございます。
    ツールを限定しているのは私に技術が無いからです。。。w
    そもそもPERIというのがなんなのかも分からないレベルですし、
    その技術を習得するのと、手元にあるソフトで仕事をこなすのとでは
    だいぶ労力に差が出てくるかなと思いまして・・・

    もちろんそのソフトがフリーソフトで、シンプルで素人にもわかりやすいものであれば
    やってみようかなという気持ちはあります。

    何かシンプルで初心者にも分かりやすい方法はありますでしょうか?
  • id:SALINGER
    >これはどのような操作を行なえばよろしいのでしょうか?
    3行目の
    Const FILENAME = "C:\Documents and Settings\hogehoge\デスクトップ\hatena\test.txt"
    この部分を、テキストファイルのフルパスにする必要があります。
    右クリックして「場所」に、+\ファイル名.txt です。
    (この\は¥(半角)です)
  • id:MAYARAN
    早速のご回答ありがとうございます!
    頂いたマクロの3段目を"C~txt"(場所+¥+ファイル名)に設定し
    いただいたアドレスの3段階目「プログラムの記述と実行」の
    「Sub/ユーザーフォームの実行」まで進めることができました。

    ですが「次のように実行するマクロを選択する画面が出ます」とのように記載されていますが
    「Sub/ユーザーフォームの実行」を選択してもそのような画面は表示されません。
    もう反映されてるのかな?と対象のBOOKを見ても何も表示されておらず・・・
    BOOK1の画面上に戻り、「ツール」→「マクロ」→「マクロ」→「実行(開いている全てのファイル」の作業を行いましたが何も表示されません。
    何かこちらの作業上の不備はございませんでしょうか?

    マクロの3行目に「場所+¥+ファイル名」を入れましたが
    ファイル名にスペースに半角を使ってはいけないなどの制限があるのでしょうか?
  • id:SALINGER
    たぶん、実行されてるようですね。
    私のマクロだと、1番からの通し番号で途中で番号が抜けていると途中で止まります。
    そして1番が無いとまったく実行されません。
    もしも、番号が1番から始まっていなくて、例えば例のように36番から始まっている場合は
    16行目の
    i=1

    i=36
    にすればいいです。
  • id:MAYARAN
    ご回答ありがとうございます!
    確かにデータ上では「3」からの番号になっています。
    試しに16行目の番号を「3」にしてみたのですが、やはり何も表示されません。。。
    その他、表示されない原因として何が考えられますでしょうか?
  • id:SALINGER
    テキストファイルのパスが間違っているとエラーが出るはずなので、間違っていないと思われます。
    コードが実行されたか判別するために
    最終行の
    End Sub
    の前の行に
    MsgBox "OK"
    を入れて実行して、メッセージボックスが出ればコードが実行されているということになります。
  • id:SALINGER
    理由がわかりました。
    データ番号の数字が全角だったのが原因のようです。
    すぐにその場合を考慮して変更して再回答します。
  • id:SALINGER
    注)2回目の回答ではファイルのパスだけを変更して、i=1の部分は変更しないでください。
  • id:SALINGER
    住所の番地・・・
    正規表現の部分を変えればどうにかなりそうです。
    しばし、お待ちを。
  • id:SALINGER
    回答が2回までだったので、自分のブログの方にあげておきました。
    下記のトラックバックを参照してください。
  • id:MAYARAN
    おおおおお全部電話番号になりました!
    マクロってすごいんですね!!
    非常に勉強になるのと共に、エクセルってこんなことまで出来るんだと
    軽く感動してしまいましたw

    またご協力をお願いすることがあると思いますので
    ぞの際はどうぞよろしくお願いします!
  • id:hiko3karasu
    コピーの方法
    C1~F1を選びます。編集>コピー。
    C2~C100とか選んで、編集>貼り付け 。
     
    コピーの方法2
    C1~F1を選びます。セルの右下の四角をつまんで下に引っぱり適当なところで離します。
  • id:MAYARAN
    hiko3karasuさん
    ご回答ありがとうございます!
    コピーの仕方まで・・・ご丁寧にありがとうございます。

    この方法はすごくシンプルですね!
    回答欄の数式はどのような理屈なのですか?
    この方法は他のリストを作成する際にも役に立ちそうでうれしいです。

    教えていただいた方法でリストを作成できたのですが
    実際に作成する場合はエクセルのリストをtxtにコピーして使用します。
    その際に1つのデータごとにスペースが空いてしまうと
    上手く編集できないのですが、エクセルを使用する段階でスペースをうまく削除する方法などは
    ありませんでしょうか?

    例えばデータ変換後は1行目のA~Dに1つ目のデータが記入されていて
    2行目~5行目までは空白、6行目に2つ目のデータが記入されています。
    何千ものこの「2~5行目」を消去したいのですが・・・可能でしょうか?

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

トラックバック

  • 電話番号を抜き出す SALINGERの日記 2008-10-04 14:52:51
    電話番号が10〜13桁になることから判別する部分をいれました。 (PHSが11桁で−をいれると13桁) ただし、 東京都墨田区12-3456-7890 なんていう長い丁番地があると判別不能。
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

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