質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.60%

vbsで、ユーザごとに最も早い時刻のレコードを取得したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 348

amatsuno

score 40

VBSを使用して、ユーザごとに最も早い時刻を取得したいと思っています

現在、以下のcsvファイルがあります

master_A.csv

date,user,u_no,action
2019/04/06 12:00,AAA,1,OFF
2019/04/06 11:00,AAA,1,GO
2019/04/06 10:00,AAA,1,ON
2019/04/06 13:30,BBB,2,END
2019/04/06 11:30,BBB,2,GO
2019/04/06 10:30,BBB,2,GO
2019/04/06 20:30,CCC,3,OFF
2019/04/06 18:30,CCC,3,GO
2019/04/06 8:30,CCC,3,ON
2019/04/09 19:15,AAA,1,END
2019/04/09 17:10,AAA,1,GO
2019/04/09 9:25,AAA,1 ON
2019/04/09 16:35,BBB,2,ON
2019/04/09 11:10,BBB,2,OFF
2019/04/09 18:50,CCC,3,GO
2019/04/09 7:55,CCC,3,OFF

このファイルから、日付毎に各ユーザの最も早い時刻の動作を出そうと考えています

目標とする結果.csv

date2,time,user,u_no,action
2019/04/06,10:00:00,AAA,1,ON
2019/04/06,10:30:00,BBB,2,GO
2019/04/06,8:30:00,CCC,3,ON
2019/04/09,9:25:00,AAA,1 ON
2019/04/09,11:10:00,BBB,2,OFF
2019/04/09,7:55:00,CCC,3,OFF

上記をADODBを使用して実現させようとしたのですが、
・group byでは[action]カラムの値が抜けなかった
・INNER JOINはcsv処理では使用できなかった

ために、以下の方法での実現を考えました

①master_Aでgroup byで抜けるものをひとまず抜く

"SELECT Format([date],'yyyy/mm/dd') as date2,  Format(min([date]),'hh:nn:ss') AS time, user , u_no "  & _
" INTO sep_master_A.csv " & _
" FROM master_A.csv " & _
" GROUP BY Format([date],'yyyy/mm/dd')  , user ,  u_no;"

結果、以下を生成しました

sep_master_A.csv

date2,time,user,u_no
2019/04/06,10:00:00,AAA,1
2019/04/06,10:30:00,BBB,2
2019/04/06,8:30:00,CCC,3
2019/04/09,9:25:00,AAA,1
2019/04/09,11:10:00,BBB,2
2019/04/09,7:55:00,CCC,3

②日付と時刻を切ったファイルを作成

objADO.Execute "SELECT Format([日時],'yyyy/mm/dd') AS date2,Format(([日時]),'hh:nn:ss') AS time, action , u_no INTO sep_master_A.csv " & _
" FROM master_A.csv ;"

sep_master_B.csv

date2,time,action,u_no
2019/04/06,12:00:00,OFF,1
2019/04/06,11:00:00,GO,1
2019/04/06,10:00:00,ON,1
2019/04/06,13:30:00,END,2
2019/04/06,11:30:00,GO,2
2019/04/06,10:30:00,GO,2
2019/04/06,20:30:00,OFF,3
2019/04/06,18:30:00,GO,3
2019/04/06,8:30:00,ON,3
2019/04/09,19:15:00,END,1
2019/04/09,17:10:00,GO,1
2019/04/09,9:25:00,ON,1
2019/04/09,16:35:00,ON,2
2019/04/09,11:10:00,OFF,2
2019/04/09,18:50:00,GO,3
2019/04/09,7:55:00,OFF,3

③sep_master_A.csvとsep_master_B.csvを突き合せる

sep_master_A.csvのレコードを1行ずつ読み、
[date2][time][u_no]が一致したレコードに対して、最終カラムに[action]の値を入れる

例:sep_master_A.csv の1行目で[date : 2019/04/06][time : 10:00:00][u_no : 1]が一致している
sep_master_B.csvのレコード(2019/04/06,10:00:00,ON,1)の[action : on]を最終カラムに入れる 
⇒ 目標とする結果.csv

を作成しようとしています

①・②はできたのですが、③がうまくいきません
(複数のカラムが一致した場合の作り方)

For i = 0 to c
If a(0) = d(0, i) Then
cr.WriteLine x & "," & d(2, i) & "," & d(0, i)
Exit For

の形式で書いてみたのですが、
書き方たがうまくいかず、
実行時に求めていたものが出ません
(実行結果が空白で出てしまう)

③の箇所をどのように作成すればよいのか、お分かりになられる方、ご教授願えませんでしょうか

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

解決しました。
Dim a, cr, cv, m, n, so, x, y, z
Set so = CreateObject("Scripting.FileSystemObject")
Set cv = so.OpenTextFile("P:\master_A.csv", 1)
Set cr = so.OpenTextFile("P:\master_B.csv", 2, True)
x = cv.ReadLine
cr.WriteLine "date2,time,user,u_no,action"
y = cv.ReadLine
a = Split(y, ",")
n = a(7)
Do Until cv.AtEndOfStream
x = cv.ReadLine
a = Split(x, ",")
If a(5) <> n Then
m = Split(y, ",")
z = Split(m(1), " ")
y = z(0) & "," & z(1) & ":00," & m(7) & "," & m(2) & "," & m(5)
cr.WriteLine y
n = a(7)
End If
y = x
Loop
a = Split(y, ",")
z = Split(a(0), " ")
y = z(0) & "," & z(1) & ":00," & a(7) & "," & a(2) & "," & a(5)
cr.WriteLine y
cr.Close
cv.Close
Set cr = Nothing
Set cv = Nothing
Set so = Nothing

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

SQL自体はこんな感じでいけると思います。
ExcelVBAで確認したのでVBScriptで動かなかったらすみません。

SELECT format(T.dt,'yyyy/mm/dd'), format(T.dt,'hh:mm:ss') as tm, T.user, B.u_no, B.action FROM (
    SELECT MIN(format(date,'yyyy/mm/dd hh:nn:ss')) as dt, user
    FROM master_A.csv AS A
    GROUP BY user, format(date,'yyyymmdd')
) AS T LEFT JOIN master_A.csv AS B ON (B.user=T.user AND format(B.date,'yyyy/mm/dd hh:nn:ss')=T.dt)
order by format(T.dt,'yyyymmdd'), T.user

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/09 16:45

    あら、解決しちゃってる、、、
    参考まで。

    キャンセル

  • 2019/04/09 16:53

    すいません。
    解決送信のタイミングでご回答をいただいたよう、ありがとうございます。
    参考にさせていただきます

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る