もし何か方法があったら教えていただきたいです。よろしくおねがいします(切実)。
Excel2010VBAで、100万行程度のCSVデータを、ADODBを使用して読み込み、
WHERE条件にヒットした行の次のヒットしていない行のデータを取得したいです。
サンプルとして、CSVが以下のようになっているとして、
F1,F2,F3
あ,い,う
え,お,か
き,く,け
こ,さ,し
※このようなデータがランダムに繰り返される
これに対して
Set DB = CreateObject("ADODB.Connection")
Set RS = CreateObject("ADODB.Recordset")
With DB
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Path & ";" _
& "Extended Properties='Text;HDR=YES;FMT=Delimited'"
.Open
End With
RS.Open "SELECT * FROM " & CSVFileName & " WHERE F1 = 'え'", DB, 1, 1
Debug.Print RS.Fields(0) & "," & RS.Fields(1) & "," & RS.Fields(2)
このコードは100万件でも処理時間はとてもいいのですが、
この時の"き,く,け"のデータが取得したいのです。
WHERE句なしで、
RS.Open "SELECT * FROM " & CSVFileName
としてから、MoveNext等でループしてF1に"え"があった次の行を取得すればできるのですが、データが多いと、非常に遅くなってしまいます。
RS.Findを使用する方法もありますが、WHERE句での検索よりも処理時間がかかりました。
別の方法として、CSVに行番号を付加し、WHERE句にヒットした行の行番号+1を条件にSELECT文を投げたらできるかな?と思い、
'行番号のあるテーブルを新たに作成
Set Ca = CreateObject("ADOX.Catalog")
Set DB = CreateObject("ADODB.Connection")
Ca.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & DBFileName & "'"
DB.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & DBFileName & "'"
DB.Execute "CREATE TABLE TESTTB(ID INT IDENTITY(1,1) PRIMARY KEY ,F1 String,F2 String,F3 String)"
'CSVをインポート
DB.Execute "INSERT INTO " & TableName & " SELECT F1,F2,F3 FROM [Text;database=" & Path & "].[" & CSVFileName & "]"
とやってみましたが、Providerがおかしいせいか、エラーは発生しませんが、
ID列が自動採番されず、空になります。。。
一行づつINSERT INTOすればできますが、データが多いとやはり時間が非常にかかってしまいます。
何かいい方法はないのでしょうか??
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
RecordSetで開いたときに
http://support.microsoft.com/kb/834927/ja
並び順が保証されるのか気になったので、ADODB ではありませんけども。
Sub Test01()
Dim sLine As String
Dim FF As Integer
Dim B As Boolean
Const CsvPath As String = "E:\Sample.CSV"
Dim i As Long
Dim t As Date
t = Now
FF = FreeFile
'入力ファイルを開く
Open CsvPath For Input Access Read As FF
'入力ファイルがEOFになるまでのループ
Do Until EOF(FF)
i = i + 1 '行番号確認用
Line Input #FF, sLine 'sLineに1行読み込み、行位置は自動的に次へ
If B Then
Debug.Print i, sLine 'イミディエイトウィンドウへ出力
End If
If InStr(sLine, "ピンポン") > 0 Then
'ここは実データに合わせてLeft(sLine,4)="ピンポン" とか適当に
B = True
Else
B = False
End If
Loop
Close 'ファイルをすべて閉じる
DoEvents 'これを入れないと進まない場合があったので
MsgBox CDate(Now - t)
End Sub
※複数行に渡って連続して、ピンポン(”え”) が出て来る場合は考えてません。
※結果報告をヨロシクね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Access(アクセス) 実行時エラー3131 FROM 句の構文エラーです について 7 2022/06/13 15:45
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- PHP php エラー 2 2022/10/23 16:43
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
ADOで複数のBookから抽出
Visual Basic(VBA)
-
「データベースまたはオブジェクトは読み取り専用なので、更新できません」エラーについて
その他(データベース)
-
EXCEL-VBAにてADOのレコードセットを使用している際のメモリの開放について
Visual Basic(VBA)
-
-
4
列番号による項目の取得について
SQL Server
-
5
split関数で区切り文字がない場合
Visual Basic(VBA)
-
6
ExcelVBAでセルを編集状態にする方法
Excel(エクセル)
-
7
VBA:Openステートメントで開いたCSVファイルの特定行を削除する方法
その他(プログラミング・Web制作)
-
8
アクセス VBAについて FROM句の構文エラー
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【VB.NET】Excelの最終行までの...
-
「Nullの使い方が不正です」の...
-
C# DataTableに最後に追加した...
-
【C#】textBoxの指定行のデータ...
-
非同期のプロセス間通信(パイプ...
-
batでレジストリキーから読み取...
-
java / jsp selectedについて
-
エクセルのマクロ コンボボッ...
-
Excel VBAでグラフの可変データ...
-
ADODBでの行番号の取得、もしく...
-
VBAコンボボックスの内容が反映...
-
VB2005 で NetworkStream で取...
-
ActiveReportのdetailをデータ...
-
COBOL数値転記の仕様
-
MSFlexGrid 行選択状態
-
エクセルのCSV読み込みについて
-
アクセスでウェブ上のデータを...
-
XMLでデータとして画像を指定す...
-
[リボンのキーボード ショート...
-
VBAでアクセスDBからデータの取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
XMLでデータとして画像を指定す...
-
【C#】textBoxの指定行のデータ...
-
VBAでアクセスDBからデータの取...
-
Excel VBAでフォルダ内の全テキ...
-
【VB.NET】Excelの最終行までの...
-
C# DataTableに最後に追加した...
-
「Nullの使い方が不正です」の...
-
VBAコンボボックスの内容が反映...
-
COBOL数値転記の仕様
-
クリスタルレポートでレコード...
-
VB2010で、選択した系列を最前...
-
アクセスでウェブ上のデータを...
-
Excel VBAで1週間毎にカテゴリ...
-
非同期のプロセス間通信(パイプ...
-
エクセルのセル最終行取得
-
ActiveReportのdetailをデータ...
-
富士通(汎用機)のAIMについて
-
Excel VBAでグループ毎に集計す...
-
エクセルのCSV読み込みについて
-
AccessVBAでのExcelメモリ解放
おすすめ情報
補足:TableName="TESTTB"
その読み込み方であれば基本的に順番通り(ファイルの上から下へ)に読み込まれると思いますが、
時間がかかりすぎます。
CSVをテーブルにインポートする時に順序が考慮されない事は知りませんでした。
RecordSetの順序は保証されるかわかりませんが、インポートができないのであれば、
質問の後半にあるやり方はできなくなります。
そうなるとCSVに行番号が無いケースでは、レコードの順番を条件にした検索は、
全くもって不可能ということでしょうか?
何か方法はないのでしょうか?