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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

2回答

935閲覧

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

amatsuno

総合スコア54

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2019/04/09 03:00

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

SQL

1SELECT format(T.dt,'yyyy/mm/dd'), format(T.dt,'hh:mm:ss') as tm, T.user, B.u_no, B.action FROM ( 2 SELECT MIN(format(date,'yyyy/mm/dd hh:nn:ss')) as dt, user 3 FROM master_A.csv AS A 4 GROUP BY user, format(date,'yyyymmdd') 5) 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) 6order by format(T.dt,'yyyymmdd'), T.user 7

投稿2019/04/09 07:45

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2019/04/09 07:45

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

2019/04/09 07:53

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

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

投稿2019/04/09 07:27

amatsuno

総合スコア54

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問