• 締切済み

Accessフィールド分割

Accessプロたちへ (質問) 1フィールドにスペースで区切られた文字が4つ存在します。 この1フィールドをスペース区切りで4つに分割する方法を教えて下さい。 (質問詳細) 1)dir /s の出力結果のファイルがあります。 2)そのデータをスペース区切りなしでインポートします。 3)2フィール目が、以下のようになります。 2008/12/12 12:29 221 aaa.txt 2008/12/14 13:56 235 bbb.txt 2008/12/11 12:30 151 ccc.txt 2008/12/11 12:30 151 ddd.txt 2008/12/11 12:30 151 eee.txt 2008/12/11 12:30 151 fff.txt 2008/12/11 12:30 151 ggg.txt  これをアクセスで取り込んで、以下のようにしたいのです。   フィールド1 フィールド2 フィールド3 フィールド4   2008/12/12  12:29     221     aaa.txt 2行目以降も同様です。 尚、上記のことを教えてもらって、最終的に、やりたいことは、 2008/12/11のファイルの合計サイズを導きだすことです。 上記の方法でなくても特定の日のファイルの合計サイズを 今のままで出すことができるのであれば、そちらで教えていただいても 構いません。 よろしくお願いします。 因みに、 最初からスペース区切りでインポートすればよいではないかと思われるかもしれませんが、それができない状態なのです。 環境:Access2003

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

標準モジュールに以下のコードを作成します。 Option Explicit Dim RegExp Function Part(ByVal Data, ByVal Idx As Long) Dim Ary If IsEmpty(RegExp) Then   Set RegExp = CreateObject("VBScript.RegExp")   RegExp.Global = True   RegExp.Pattern = "\s+" End If Ary = Split(RegExp.Replace(Data, vbTab), vbTab) Select Case Idx   Case 0, 1: Part = CDate(Ary(Idx))   Case 2: Part = CLng(Ary(2))   Case 3: Part = Ary(3) End Select End Function SQLは以下の通り。 SELECT Part(フィールド,0) AS 日付,Part(フィールド,1) AS 時刻, Part(フィールド,2) AS サイズ,Part(フィールド,3) AS 名前 FROM ~ 区切り文字がタブだったり、各行の文字数が不特定な場合でも使用 できます。また、VBのSplitと異なり、連続した区切り文字は1文字 として扱うので、区切り文字数を気にする必要もありません。 尚、日付と時刻は日付型、サイズは長整数、名前は文字型です。 但し、項目の置かれる文字位置が絶対である場合はMidを使う方が 高速です。

tokudasinn
質問者

お礼

ご丁寧な回答ありがとうございます。 試してみます。

  • noah7150
  • ベストアンサー率46% (116/251)
回答No.2

あ!、CIntじゃ桁あふれするでしょうね CLngですね でも、CLngでも2GBくらいまでしか出せません 巨大ファイルを扱うなら数値変換の型は考えたほうが良いでしょうね 追記 DIR /Sでは<DIR>以外にもルート名や余白もあるのでこれらを除く方法を考えないと数値変換でエラーを起こすでしょう そのへんの考慮も

tokudasinn
質問者

お礼

早速の回答ありがとうございます。 巨大ファイルといえるかわかりませんが、 800万レコードあります。 試してみます。

  • noah7150
  • ベストアンサー率46% (116/251)
回答No.1

別にAccessのプロじゃなくても分かると思いますが・・・ それに丸投げは禁止されてますよ なのでヒントだけ Dirコマンドは固定長になっているはずなので Mid関数で切れば出来るでしょう SELECT Mid(LIST_REC,1,10) AS 作成日, Mid(LIST_REC,13,5) AS 作成時刻, CInt(Mid(LIST_REC,19,17)) AS サイズ, Mid(LIST_REC,37) AS ファイル名 FROM DIR_LIST WHERE Mid(LIST_REC,5,1) = "/" AND Mid(LIST_REC,22,5) <> "DIR" 後は作成日を選択するかグループ化してSumなりCountで加工してね 尚、Accessで検証してませんのでSQLにエラーがあるかもしれません

tokudasinn
質問者

お礼

早速の回答ありがとうございます。 丸投げ禁止だったんですね。 ルール違反でした。以後、気をつけます。 素人なので、多分時間かかると思いますが 試してみます。