| 
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2008/03/11 21:21
名前: 花ちゃん
 
************************************************************************************ カテゴリー:[ファイル入出力][][]                                              *
 * キーワード:CSVファイル,テキストファイル,重複,抽出,                 *
 ***********************************************************************************
 タイトル : CSVから重複しないデータの抽出
 記事No : 11305
 投稿日 : 2008/02/01(Fri) 16:22
 元質問 : さるうっち
 
 ○○県,○○町,13-132,○田○子,090-1111-1111
 △○県,■○市,4312,○嶋○美,090-2222-5555
 ○○県,○○町,525,○山○子,090-2222-5555
 ○□県,○△町,332,○谷○夫,090-3333-4444
 ・
 ・
 という住所データ(1000行)があります。
 このデータから、重複しない住所(都道府県、市町村)
 の組み合わせを抽出したいのです。
 
 -----------------------------------------------------------------------------------
 記事No : 11306
 投稿日 : 2008/02/01(Fri) 16:55
 回答者 : YK
 -----------------------------------------------------------------------------------
 
 Option Explicit
 Private Declare Function timeGetTime Lib "winmm.dll" () As Long
 Private lngStartTime As Long
 
 Private Sub Command1_Click()
 List1.Clear
 fTimeCount
 Dim SD      As Object
 Dim strFnm  As String
 Dim intFno  As Integer
 Dim strBuf  As String
 Dim varD    As Variant
 Dim i       As Long
 
 strFnm = "c:\TEST.csv"
 intFno = FreeFile
 
 Set SD = CreateObject("Scripting.Dictionary")
 
 Open strFnm For Input As #intFno
 Do While Not EOF(intFno)
 Line Input #intFno, strBuf
 varD = Split(strBuf, ",")
 SD(varD(0) & "," & varD(1)) = Empty
 Loop
 Close #intFno
 
 varD = SD.keys
 List1.Visible = False
 For i = 0 To UBound(varD)
 List1.AddItem varD(i)
 Next
 List1.Visible = True
 MsgBox fTimeCount
 End Sub
 
 '1行全体での重複チェックの場合
 Private Sub Command2_Click()
 List1.Clear
 fTimeCount
 
 Dim SD      As Object
 Dim strFnm  As String
 Dim intFno  As Integer
 Dim strBuf  As String
 Dim varD    As Variant
 Dim i       As Long
 
 strFnm = "c:\TEST.csv"
 intFno = FreeFile
 
 Set SD = CreateObject("Scripting.Dictionary")
 
 Open strFnm For Input As #intFno
 Do While Not EOF(intFno)
 Line Input #intFno, strBuf
 '      varD = Split(strBuf, ",")
 SD(strBuf) = Empty
 Loop
 Close #intFno
 
 varD = SD.keys
 List1.Visible = False
 For i = 0 To UBound(varD)
 List1.AddItem varD(i)
 Next
 List1.Visible = True
 MsgBox fTimeCount
 End Sub
 
 Private Function fTimeCount() As String
 Static lngST As Long
 If lngST = 0& Then
 lngST = timeGetTime
 Else
 fTimeCount = "経過時間=" & Str$((timeGetTime - lngST) / 1000) & " 秒です"
 lngST = 0&
 End If
 End Function
 
 Scripting.Dictionary オブジェクト については下記に解りやすく書いてあります。
 (Tatsuya's Home Page 配列操作 Dictionaryオブジェクト編)
 http://www.red.oit-net.jp/tatsuya/vb/Dictionary.htm
 
 ○○県,○○町,13-132,○田○子,090-1111-1111 のデータを2000件内同じデータを40件
 作成してテストした結果の実行画像(画像をクリックすると元のサイズで表示されます)
 他の方法と処理速度を比較しようと思ったのですが、その必要も無いほど早いのでやめました。
      |