[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/02/28(Tue) 18:11
投稿者名:やまめ
Eメール:
URL :
タイトル:
CSVファイル内のデータ検索
こんにちは、いつもこのページにはお世話になっています。

以下のような内容なのですが、どなたか教えてください。

<やりたいこと>
CSVファイル内に記録されているデータ(日時も含む)から、
指定された期間のデータだけを抽出したい。

<やってみたこと1>
普通にテキストファイルとしてOPENして、1件ずつ調べてみました。
もちろん、できますが、数秒かかります。
(テストではデータ件数150件。本番では1000件程度を予定)

<やってみたこと2>
データベースの検索(SQL)やフィルタを使って早く行おうと思って、
DAOと繋いでみましたが、データは見れますが、Indexひとつ指定できませんでした。

Dim strConnectString As String
Dim iret As Integer

strConnectString = "Text;DATABASE=" & App.Path

Set mdb = OpenDatabase(App.Path, False, False, strConnectString)
Set mrs = mdb.OpenRecordset("data.csv", dbOpenTable)

mrs.Index = "A" ←エラー

<聞きたいこと>
そもそも、SQLなどはデータベースの機能なので、DAOに繋いだからといって、
CSVファイル内のデータがすばやく絞り込めるようなものではないのでしょうか?
(当たり前と言われそうで恥ずかしいですが・・・。)

それであれば、上述のやりたいことをすばやく行うためには、
他にどのような方法があるのでしょうか。

超初心者質問で、大変恐縮ですが、よろしくお願いします。

投稿時間:2006/02/28(Tue) 21:03
投稿者名:neptune
Eメール:
URL :
タイトル:
Re: CSVファイル内のデータ検索
> <聞きたいこと>
> そもそも、SQLなどはデータベースの機能なので、DAOに繋いだからといって、
> CSVファイル内のデータがすばやく絞り込めるようなものではないのでしょうか?
そんなことはありません。Testファイルとして1行ずつ読むより早いと思います。
但し、記憶ですが、Textファイルにアタッチした場合、
インデックスは設定することは出来なかった仕様と思います。

> それであれば、上述のやりたいことをすばやく行うためには、
> 他にどのような方法があるのでしょうか。
ぱっと思いつく案は、
1.1000件程度なら、バイナリ読み込みで一気読みして、メモリ上で検索する
2.Indexファイルを別途作っておき、そこを検索し、その結果でデータファイルからデータを
  抽出する。(この場合は、データファイルは固定長ファイルにしておくとDBなみに速い)
3.mdbファイルにしてしまう。

いづれにしても、CSVファイルのままならスピードの限界は遅いところになるとは思います。

投稿時間:2006/02/28(Tue) 22:41
投稿者名:やまめ
Eメール:
URL :
タイトル:
Re^2: CSVファイル内のデータ検索
ありがとうございます。

> そんなことはありません。Testファイルとして1行ずつ読むより早いと思います。
> 但し、記憶ですが、Textファイルにアタッチした場合、
> インデックスは設定することは出来なかった仕様と思います。

CSVファイルもDAOを使って、検索、条件による絞込みができると理解していいのでしょうか?
手元の本なのでも、mdbとの接続の例ばかりなので、できないのかと思ってしまいました。

これで、データが絞り込めるのであれば、この方法でやりたいです。
(検索するデータが日付と時刻なので、うまくできるのか心配です。)


教えていただいた下記では、3が一番簡単そうなので、
上記が駄目ならこれかなと思いますが・・・。

> 1.1000件程度なら、バイナリ読み込みで一気読みして、メモリ上で検索する
> 2.Indexファイルを別途作っておき、そこを検索し、その結果でデータファイルからデータを
>   抽出する。(この場合は、データファイルは固定長ファイルにしておくとDBなみに速い)
> 3.mdbファイルにしてしまう。
>
> いづれにしても、CSVファイルのままならスピードの限界は遅いところになるとは思います。

投稿時間:2006/03/01(Wed) 10:17
投稿者名:neptune
Eメール:
URL :
タイトル:
Re^3: CSVファイル内のデータ検索
こんちは

> CSVファイルもDAOを使って、検索、条件による絞込みができると理解していいのでしょうか?
その理解でOKです。削除は多分不可だったと思いますが。(確認してください。)

> これで、データが絞り込めるのであれば、この方法でやりたいです。
> (検索するデータが日付と時刻なので、うまくできるのか心配です。)
MSのKBに資料がありますから読んで下さい。
[VB5] 他形式のファイルから Jet データベースへのインポート方法
hhttp://support.microsoft.com/default.aspx?scid=kb;ja;410871
[VB4] CSV 形式で保存されたテキスト データへのアクセス方法
hhttp://support.microsoft.com/kb/408179/JA/

hhttp://support.microsoft.com/default.aspx?scid=kb;ja;257819
/////////上記より一部引用////////
※最初の行を列見出しとして使用するかどうかを設定するには、接続文字列 Extended Properties
に HDR= の設定を追加します。HDR= の設定を追加しない場合、またはデフォルトの HDR=Yes を
追加した場合は、最初の行が列見出しとして使用されます。


> 教えていただいた下記では、3が一番簡単そうなので、
> 上記が駄目ならこれかなと思いますが・・・。
個人的に簡単なのは1.と思いますが、データをmdb化すれば、3が一番処理速度は速いでしょうね。

投稿時間:2006/03/01(Wed) 12:11
投稿者名:やまめ
Eメール:
URL :
タイトル:
Re^4: CSVファイル内のデータ検索
ありがとうございます。

環境を書くのを忘れていましたが、
WinXP、VB6.0、Office2000です。

紹介いただいた方法はこの環境でもOKなのでしょうか?

投稿時間:2006/03/01(Wed) 13:26
投稿者名:neptune
Eメール:
URL :
タイトル:
Re^5: CSVファイル内のデータ検索
こんにちは

> 環境を書くのを忘れていましたが、
> WinXP、VB6.0、Office2000です。
>
> 紹介いただいた方法はこの環境でもOKなのでしょうか?
テストプログラムなんか、サンプルがあるのですぐ作れますから、
尋ねるより、自分で確認した方が早いと思いますが・・・
勿論、DAO,ADOが使える環境ならいずれでもOKです。

投稿時間:2006/03/01(Wed) 23:42
投稿者名:やまめ
Eメール:
URL :
タイトル:
日付/時刻型データのCSV書き出し
ありがとうございます。色々試行錯誤してみました。

結果、データはmdbで持ち、必要になったタイミングで、
CSVにセーブしようと思いましたが、date型の情報が、
数値になって書き出されてしまいます。

何か方法はあるのでしょうか?
やはり、1レコードずつ、テキストとして書き出すしかないのでしょうか。

<試したコード>

Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test\db1.mdb;Persist
Security Info=False"
cn.Open

Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
sql = "SELECT * FROM TextTable WHERE myNOW BETWEEN #2006/03/01 21:48:31# AND #2006/03/01
21:48:36#"
rs.Open sql, cn, adOpenStatic
Set DataGrid1.DataSource = rs
Debug.Print rs!no, rs!mydate, rs!mytime
    
'変数にオブジェクトを割り付ける
Set xlApp = New Excel.Application
    
'Excel表示
xlApp.Visible = False
'確認メッセージ非表示
xlApp.DisplayAlerts = False

Set xlBook = xlApp.Workbooks.Add
xlBook.worksheets(1).cells(1, 1).copyfromrecordset rs
    
'Bookを閉じる
xlBook.SaveAs App.Path & "\testxls.csv", xlCSV ←時刻が数値としてセーブされてしまう。

よろしくお願いします。

投稿時間:2006/03/02(Thu) 08:27
投稿者名:YK
Eメール:
URL :
タイトル:
Re: 日付/時刻型データのCSV書き出し
こんにちは。

> CSVにセーブしようと思いましたが、date型の情報が、
> 数値になって書き出されてしまいます。
>
> 何か方法はあるのでしょうか?
エクセルでマクロの記録で対象列を書式設定してみましょう。
そのコードを
>xlBook.worksheets(1).cells(1, 1).copyfromrecordset rs
の前に入れてOK。

投稿時間:2006/03/02(Thu) 08:43
投稿者名:neptune
Eメール:
URL :
タイトル:
Re: 日付/時刻型データのCSV書き出し
こんちは

>CSVにセーブしようと思いましたが、date型の情報が、
>数値になって書き出されてしまいます。
>何か方法はあるのでしょうか?
>やはり、1レコードずつ、テキストとして書き出すしかないのでしょうか。
3つ提案します。
方法1 YKさんが既に書かれてます。
 copyfromrecordset の後で、date型のフィールドに該当するExcel Sheetの
 列のセルの書式を日付型に設定する ⇒ CSVとして保存
方法2
 地道に1レコードずつテキストとして書き出す。
 ※但し、Date型は数値だから、format関数で当該fieldは文字列に変換する必要があると思う。
方法3 Accessがインストールされている条件付
 DoCmd.TransferTextを使う

投稿時間:2006/03/02(Thu) 22:36
投稿者名:やまめ
Eメール:
URL :
タイトル:
Re^2: 日付/時刻型データのCSV...
みなさん、ありがとうございます。

とても参考になりました。

また、よろしくお願いします。