- 日時: 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件 作成してテストした結果の実行画像(画像をクリックすると元のサイズで表示されます) 他の方法と処理速度を比較しようと思ったのですが、その必要も無いほど早いのでやめました。
|