Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1776 / 2272 ツリー ←次へ | 前へ→

【5349】レコードの内容で新たな列に割り付ける えるてそろ 05/6/10(金) 10:47 質問[未読]
【5350】Re:レコードの内容で新たな列に割り付ける 小僧 05/6/10(金) 14:16 発言[未読]
【5351】Re:レコードの内容で新たな列に割り付ける えるてそろ 05/6/10(金) 15:16 質問[未読]
【5353】Re:レコードの内容で新たな列に割り付ける 小僧 05/6/10(金) 15:46 発言[未読]
【5354】Re:レコードの内容で新たな列に割り付ける えるてそろ 05/6/10(金) 18:02 質問[未読]
【5355】Re:レコードの内容で新たな列に割り付ける 小僧 05/6/10(金) 20:09 回答[未読]
【5357】Re:レコードの内容で新たな列に割り付ける えるてそろ 05/6/10(金) 22:44 お礼[未読]
【5359】Re:レコードの内容で新たな列に割り付ける えるてそろ 05/6/11(土) 14:11 お礼[未読]
【5358】Re:レコードの内容で新たな列に割り付ける hatena 05/6/11(土) 12:10 回答[未読]

【5349】レコードの内容で新たな列に割り付ける
質問  えるてそろ  - 05/6/10(金) 10:47 -

引用なし
パスワード
   初めて投稿します。全くの初心者なのですが、質問してもいいでしょうか。
テーブルAがあるのですが、データ分析の為
テーブルBのような形にしたいのですが、
良い手法をご教示ください。
よろしくお願いします。

テーブルA
フィールド1   フィールド2
AAA     123
BBB     あああ
CCC     05/06/10
---
AAA     456
BBB     いいい
CCC     04/06/12
---
:続く


テーブルB
AAA     BBB     CCC (フィールド名になります)
123     あああ   05/06/10
456     いいい   04/06/12
:      :      :
:      :      :

【5350】Re:レコードの内容で新たな列に割り付ける
発言  小僧  - 05/6/10(金) 14:16 -

引用なし
パスワード
   ▼えるてそろ さん:
こんにちは。

ご提示の内容ですと「123」「あいう」「05/06/10」の関連性が
みえてきません。
他に「ID」フィールドとかあって

テーブルA
ID F1  F2
1 AAA 123
1 BBB あああ
1 CCC 05/06/10
2 AAA 456
2 BBB いいい
2 CCC 04/06/12

ID AAA BBB   CCC
1  123 あああ 05/06/10
2  456 いいい 04/06/12

なら理解できるのですが…。

テーブルAの構造自体がちょっとおかしいので見直しをした方がよいかもしれません。
通常は一つのフィールドに対して数値、文字、日付が入る事はないと思われます。

※フィールド名に半角カタカナを用いるのは極力避けましょう。

【5351】Re:レコードの内容で新たな列に割り付ける
質問  えるてそろ  - 05/6/10(金) 15:16 -

引用なし
パスワード
   ▼小僧 さん:
早速の返信、ありがとうございました。

>他に「ID」フィールドとかあって
>テーブルA
>ID F1  F2
>1 AAA 123
>1 BBB あああ
>1 CCC 05/06/10
>2 AAA 456
>2 BBB いいい
>2 CCC 04/06/12
>ID AAA BBB   CCC
>1  123 あああ 05/06/10
>2  456 いいい 04/06/12
>
>なら理解できるのですが…。
>テーブルAの構造自体がちょっとおかしいので見直しをした方がよいかもしれません。
>通常は一つのフィールドに対して数値、文字、日付が入る事はないと思われます。

ご指摘有難うございました。
確かにそうなのですが、もう少し事情を説明させていただきますと
データは通信ログファイルで、時間ごとの通信の結果が
テキストになっております。
データ間の-----も実際にデータとして存在しています。

簡素化のため、略して説明しまして 申し訳ありませんでした。
実際のデータは9行で1レコードになっていて70万行ほどになります。
なんとかして、1行1レコードにして分析できるようにしたいのです。

何か良い知恵がありましたら、よろしくお願いいたします。
DAY:05/06/11 23:00
ANODEkw:234
BNODEkw:123
CNODEkw:222
AETC:abcd
BETC:cd
CETC:
DETC:
------------
DAY:05/06/11 23:05
ANODEkw:
:
:(続く)

【5353】Re:レコードの内容で新たな列に割り付ける
発言  小僧  - 05/6/10(金) 15:46 -

引用なし
パスワード
   ▼えるてそろ さん:
こんにちは。

>実際のデータは9行で1レコードになっていて70万行ほどになります。

この情報が欲しかったんですよね。

>> 1) 取り込んでからクエリ等で加工する。
>>
>> 2) 取り込む際に加工しながら取込む。
>>
>> 3) 取り込む前に加工し、加工したテキストを読み込む。

当方が思いつく限り3通りの方法があると思われますが、
正直700,000レコードあるデータの処理をするのにどれが一番効率的かは
試してみないと解りません。

上記3つの手続きでしたらVBAで可能です。

以下いくつか確認です。

1) フィールドは「DAY」「ANODEkw」の様な形で、
  データは「234」「abcd」という形で宜しいですか?

2) 「DAY」の行で欲しいデータは
  A:日付だけ
  B:日付+時間
  C:日付と時間を別フィールドで

3) データは必ず9の倍数で最後は「------------」で終わっていますか?

【5354】Re:レコードの内容で新たな列に割り付ける
質問  えるてそろ  - 05/6/10(金) 18:02 -

引用なし
パスワード
   ▼小僧 さん:
早速のご回答有難うございます。

>以下いくつか確認です。

>1) フィールドは「DAY」「ANODEkw」の様な形で、
>  データは「234」「abcd」という形で宜しいですか?
ここまで詳しく聞いていただいたら、
実際のデータを見ていただいたほうが良いかと思うので
内容は少し変えて貼り付けします。

<テーブルA>
F1        F2
DATE:        05/06/08 7:13:20
METHOD:        PROXY
SERVER:        ns.xxxxx.jp
USER:        192.168.7.7
CLIENTIP:        192.168.7.7
SERVERIP:        111.111.222.333
DOMAIN:        www.yahoo.co.jp
PATH:        mail_img/tuesdaaaaaaaaaaaaaaaaaaaaaaa
----------------------------------
:ずっと続く

<テーブルB>
F1    F2   F3    F4  F5   F6   F7   F8  F9
DATE:  TIME:  METHOD: 以降続く

:ずっと続く  7万件くらいのデータに改善できるはず

>2) 「DAY」の行で欲しいデータは
>  A:日付だけ
>  B:日付+時間
>  C:日付と時間を別フィールドで

出来れば、Cですと一番ありがたいです。

>3) データは必ず9の倍数で最後は「------------」で終わっていますか?

必ず、----で終わります。

お忙しいところ、わがままを申して申し訳ありませんが、
よろしくお願いいたします。

【5355】Re:レコードの内容で新たな列に割り付ける
回答  小僧  - 05/6/10(金) 20:09 -

引用なし
パスワード
   ▼えるてそろ さん:
こんばんは。

DATE:05/06/08 07:13:20
METHOD:PROXY
SERVER:ns.xxxxx.jp
USER:192.168.7.7
CLIENTIP:192.168.7.7
SERVERIP:111.111.222.333
DOMAIN:www.yahoo.co.jp
PATH:mail_img/tuesdaaaaaaaaaaaaaaaaaaaaaaa
----------------------------------

こんな感じの元データで宜しければ

Sub 加工してから()
Dim FSO As Object
Dim TName As String '取込テーブル名
Dim RFile As Object
Dim RPath As String '元のファイルフルパス
Dim RName As String '元のファイル名
Dim WFile As Object
Dim I As Long
Dim L As String

  TName = "T_取り込み"
  RPath = "C:\temp"
  RName = "Log.txt"
  
  Set FSO = CreateObject("Scripting.FileSystemObject")
  Set RFile = FSO.OpenTextFile(RPath & "\" & RName)
  Set WFile = FSO.CreateTextFile(RPath & "\temp.csv")
    WFile.WriteLine _ 
       "LOGDATE,LOGTIME,METHOD,SERVER," _
      & "USER,CLIENTIP,SERVERIP,DOMAIN,LOGPATH"
    
    Do Until RFile.AtEndOfStream
      For I = 1 To 9
        L = RFile.ReadLine
        
        Select Case I
          Case 1
            WFile.Write Mid(L, 6, 8) & "," & Mid(L, 15, 8) & ","
          Case 2, 3, 7
            WFile.Write Right(L, Len(L) - 7) & ","
          Case 4
            WFile.Write Chr(34) & Right(L, Len(L) - 5) & Chr(34) & ","
          Case 5, 6
            WFile.Write Chr(34) & Right(L, Len(L) - 9) & Chr(34) & ","
          Case 8
            WFile.WriteLine Right(L, Len(L) - 5)
        End Select
      Next
    Loop
    
  WFile.Close: Set WFile = Nothing
  RFile.Close: Set rdile = Nothing
  
  DoCmd.TransferText acImportDelim, , TName, RPath & "\temp.csv", True
  
  FSO.DeleteFile RPath & "\temp.csv"
  Set FSO = Nothing
End Sub

「DATE」「PATH」などは予約語なので名前を変えてあります。
外していたら申し訳ないです。

【5357】Re:レコードの内容で新たな列に割り付ける
お礼  えるてそろ  - 05/6/10(金) 22:44 -

引用なし
パスワード
   ▼小僧 さん:

>「DATE」「PATH」などは予約語なので名前を変えてあります。
>外していたら申し訳ないです。

とんでもないです。
お忙しいところ、本当に有り難うございました。
明日 早速試してみます。
又結果をお知らせします。

【5358】Re:レコードの内容で新たな列に割り付ける
回答  hatena  - 05/6/11(土) 12:10 -

引用なし
パスワード
   横から失礼します。
小僧さんの

>> 2) 取り込む際に加工しながら取込む。

の方法で考えてみました。

事前に下記のようなテーブルを作成しておきます。

テーブル T_Log 
フィールド LogDATE (日付/時刻型)
      LogTime (日付/時刻型)
      METHOD (テキスト型)
      SERVER (テキスト型)
      USER  (テキスト型)
      CLIENID (テキスト型)
      SERVERIP(テキスト型)
      DOMAIN (テキスト型)
      LogPATH (テキスト型)


Public Sub 加工しながら取込む()
Dim Rs As DAO.Recordset
Dim I As Long
Dim L As String

  Open "C:\temp\Log.txt" For Input As #1
  Set Rs = CurrentDb.OpenRecordset("T_Log")
  
  Do While Not EOF(1)
    For I = 1 To 9
      Line Input #1, L
      Select Case I
      Case 1
        Rs.AddNew
        Rs!LogDate = CDate(Mid(L, 6, 8))
        Rs!LogTime = CDate(Mid(L, 15, 8))
      Case 2
        Rs!METHOD = Mid(L, 8)
      Case 3
        Rs!SERVER = Mid(L, 8)
      Case 4
        Rs!USER = Mid(L, 6)
      Case 5
        Rs!CLIENTIP = Mid(L, 10)
      Case 6
        Rs!SERVERIP = Mid(L, 10)
      Case 7
        Rs!DOMAIN = Mid(L, 8)
      Case 8
        Rs!LogPath = Mid(L, 6)
        Rs.Update
      End Select
    Next
  Loop
  Close #1
  Rs.Close: Set Rs = Nothing
End Sub

【5359】Re:レコードの内容で新たな列に割り付ける
お礼  えるてそろ  - 05/6/11(土) 14:11 -

引用なし
パスワード
   ▼小僧 さん:
完璧でした。
希望どおりのデータを得ることが出来ました。
処理速度も数十秒で終わり、申し分ありません。

こちらのわがままを たくさん聞いていただいて 有難うございました。

1776 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078256
(SS)C-BOARD v3.8 is Free