[[20150123064915]] 『レコードの一部が部分一致するセルだけを抽出』(うみ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『レコードの一部が部分一致するセルだけを抽出』(うみ)

お世話になります。

URLのレコードが数万件(セル)あります。

このレコード(URL)で完全一致するダブリデータは抽出出来るのですが、この内、一部分だけ(例えばドメインの内5文字がマッチするとか)被るものだけも抽出したいのです。

フィルタなどで取り出しはできるのですが一つ一つ対応せざるを得ず、同時に多変量の一部ののデータだけをマッチングさせたいのですが…。

どなたかご存知であれば助かります。

< 使用 Excel:Excel2013、使用 OS:Windows8 >


 ドメインのうち連続した5文字が一致ということ?

 http://www.sample.jp
 http://www.exmple.jp
 これは同一とみなすの?

 http://www.sample.jp
 http://www.sample.jp/abcd/
 こっちは?

 いずれにしろもう少し使用明確にしないと回答付きにくい?
(稲葉) 2015/01/23(金) 08:33

 たとえば最初のものと2番目は一致。
 で、2番目と3番目も一致。
 こんな場合は?

 http://www.ABCDEFGHIJK.jp
 http://www.ABCDEvwxyz.jp
 http://www.vwxyzLMNOPQ.jp

 「フィルタなどで取り出しはできるのですが一つ一つ対応せざるを得ず」

 ということで、何かしら、(うみ)さんの頭の中には、この操作のアルゴリズムがあるわけですよね。
 時間さえかければ、何日かしたら作業はできる。

 だとすれば、その作業の手順を説明したらいかが?

 そうすれば、あとは、その膨大な作業を、どうやって自動化するかという方向になるので。

(β) 2015/01/23(金) 08:54


 どっかでseiyaさんが正規表現で連続する20文字くらいの重複を探すプログラムがどっかに
 あると思うけど見つからない・・・

 無理やり案でsubドメインも含む連続した文字の検索例
    Option Explicit
    Sub test()
        Dim tbl
        Dim cntLEN As Long
        Dim dic As Object
        Dim i As Long
        Dim j As Long
        Dim a
        Dim b
        Dim itms
        Dim itm
        Dim k
        '//連続する文字数
        cntLEN = 5

        '//検索セル範囲
        tbl = Range("A1:B10").Value

        Set dic = CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(tbl, 1)
            a = GetURLtoDomain(tbl(i, 1), cntLEN)
            If UBound(a) > 0 Then
                For Each b In a
                    If Len(b) > cntLEN Then
                        For j = 1 To Len(b) - cntLEN
                            PartsStringMatch dic, Mid(b, j, cntLEN), i
                        Next j
                    ElseIf Len(b) > 0 Then
                        PartsStringMatch dic, b, i
                    End If
                Next b
            End If
        Next i
        For Each k In dic.keys
            itms = Split(dic(k), ",")
            If UBound(itms) > 0 Then
                For Each itm In itms
                    tbl(itm, 2) = k
                Next itm
            End If
        Next k
        With Sheets.Add
            .Range("A1").Resize(UBound(tbl, 1), UBound(tbl, 2)).Value = tbl
        End With
    End Sub
    Private Function GetURLtoDomain(ByVal myURL As String, ByVal cntLEN As Long)
        Dim alldmn As String
        Dim subdmn As String
        Dim Matches
        Dim tmp()
        Dim n As Long
        Dim m
        ReDim tmp(1 To 1)
        With CreateObject("VBScript.RegEXP")
            .Pattern = "//(.*)/*"
            If .test(myURL) Then
                alldmn = .Execute(myURL)(0).submatches(0) & "."
                .Pattern = "(.+?)\."
                .Global = True
                If .test(alldmn) Then
                    Set Matches = .Execute(alldmn)
                    n = 1
                    For Each m In Matches
                        If Len(m.submatches(0)) >= cntLEN Then
                            ReDim Preserve tmp(1 To n)
                            tmp(n) = m.submatches(0)
                            n = n + 1
                        End If
                    Next m
                End If
            End If
        End With
        If UBound(tmp) > 0 Then
            GetURLtoDomain = tmp
        Else
            GetURLtoDomain = Array()
        End If
    End Function
    Private Sub PartsStringMatch(ByRef dic As Object, ByVal x As String, ByVal InsertItem As String)
        If dic.exists(x) Then
            dic(x) = dic(x) & "," & InsertItem
        Else
            dic.Add x, InsertItem
        End If
    End Sub
(稲葉) 2015/01/23(金) 10:11

[[20141202053610]]
 あった!
 これ使えばもう少し簡単にできるかも
(稲葉) 2015/01/23(金) 10:13

ありがとうございます。補足させてください。

ドメインのうち連続した5文字が一致ということ? http://www.sample.jp http://www.exmple.jp これは同一とみなすの? http://www.sample.jp http://www.sample.jp/abcd/ こっちは?

この例、つまり

http://www.sample.jp http://www.exmple.jp http://www.sample.jp http://www.sample.jp/abcd/

は仰るとおり同一としてピックアップします。(http://www. は省いたと仮定いたします)

次に掲示いただいた例

http://www.ABCDEFGHIJK.jp http://www.ABCDEvwxyz.jp http://www.vwxyzLMNOPQ.jp

1と2は同じものとしてみなし、3つ目はみなしません。

そして例えば

http://www.12345.jp/abcde
http://www.67890.jp/abcde

これも同一としてみなします。

現状、重複セルは条件付き書式のduplicate しているものでピックアップ(セルを色付きで表示)(利用しているのがExcel2013の英語版なので、目ジュー表示文字が微妙に正規日本語版間違っていたら恐縮ですが、機能は同じです)か、もしくは目視で気になる重複箇所をフィルタでピックアップなどで対応しているのですが、ここらへんを機械的に終わらせたいのです。

またマッチングは例えば例として5文字を上げましたが、例えば5文字以上だけが重複するセルだけを色付きで表示するとか、そういった抽出をしたい(つまり、数万ある中で一つのペアだけを抽出したいわけでなく、5文字重複するパターンはたくさんあるので、それらをまとめて抽出したい = 例えば、ABCDEのパターン、12345のパターン…などなど)

もし不足あればご指摘いただければありがたいです。

(うみ) 2015/01/23(金) 20:12


 まず

 'http://www.ABCDEFGHIJK.jp 
 'http://www.ABCDEvwxyz.jp 
 'http://www.vwxyzLMNOPQ.jp 

 「1と2は同じものとしてみなし、3つ目はみなしません。」 

 なぜ? 2 と 3 は 同じ vwxyz という文字列がありますよね。
 これはみなさないという、その「ルール」を「言葉で明確に」していただけますか?

 次に

 ABCDEFGHIJ
 ACDEFGHIJK
 ADEFGHIJKL

 の3つの文字列があったとして、最初の文字列の中の連続した5文字は
 ABCDE  BCDEF CDEFG DEFGH EFGHI FGHIJ の 6つですよね。
 この 6つがそのほかの「数万」の文字列にあるかどうかを見たいのですか?

 で、ほかの文字列の中に、これらの、たとえば 3つとマッチするものがあれば、ペアの色は、どういう扱いですか?

 さらに、2番目の文字列にも、たくさんの「連続した5文字」がありますよね。これも、そのほかの「数万」の文字列とつきあわせ?

 実際の文字列は、もっと長い桁数だと思います。1つの文字列の中に、連続した5桁が 100個あったとします。

 そうすると、突合せの数は 100 X 数万 X 数万 になりますね?

 ほんとに、そういうことですか??

 いやいや、そうではないということだと思います。

 なので、ここでも、「言葉で、そのルールを明確にしてほしい」と、そう希望しています。

(β) 2015/01/23(金) 20:26


お世話になります。

この回答の2番めにいただいた、例示を見て、(仰るとおり全パターンを抽出したいのです)エクセルを使って現実的に処理できなさそうかなと。ご指摘の通り、億以上のパターンになってしまいますね。

お騒がせしました、色々ご返答有難うございます。

(うみ) 2015/01/23(金) 21:28


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.