現在、2つのcsv(元を2つ)を統合して、
1つのcsv(目的としている結果)を作成しようとしております
vbsで作成しています。
csv1(元):csv_tmp2.csv
日付,off_t,名前,act,U_NO,T_name,on_t
2019/5/7,8:30 ,CCC,END,30,A-GP,8:29
2019/5/7,8:51 ,AAA,END,15,A-GP,8:49
2019/5/7,11:26,BBB,END,20,A-GP,8:38
2019/5/6,17:04,CCC,OFF,30,A-GP,8:28
2019/5/6,17:58,AAA,OFF,15,A-GP,8:49
2019/5/6,19:21,BBB,END,20,A-GP,8:36
2019/5/5,17:04,CCC,OFF,30,A-GP,8:31
2019/5/5,18:40,AAA,OFF,15,A-GP,8:48
2019/5/5,22:34,BBB,OFF,20,A-GP,8:30
2019/5/2,19:10,AAA,OFF,15,A-GP,8:51
2019/5/2,23:28,BBB,OFF,20,A-GP,8:52
csv2(元):time_tmp2.csv
日付,U_NO,名前,using_time
2019/5/2,15,AAA,8:23:09
2019/5/2,20,BBB,10:33:02
2019/5/5,30,CCC,7:34:01
2019/5/5,15,AAA,8:50:37
2019/5/5,20,BBB,11:43:57
2019/5/6,30,CCC,7:33:15
2019/5/6,15,AAA,7:54:07
2019/5/6,20,BBB,8:05:25
2019/5/7,30,CCC,0:01:00
2019/5/7,15,AAA,0:01:00
2019/5/7,20,BBB,2:14:36
作成後のcsv(目的としている結果):csv_tmp3.csv
日付1,T_name,名前,ON1,OFF1,using_time
2019/5/7,A-GP,AAA,8:29,8:30,0:01:00
2019/5/7,A-GP,BBB,8:49,8:51,2:14:36
2019/5/7,A-GP,CCC,8:38,11:26,0:01:00
2019/5/6,A-GP,AAA,8:28,17:04,7:54:07
2019/5/6,A-GP,BBB,8:49,17:58,8:05:25
2019/5/6,A-GP,CCC,8:36,19:21,7:33:15
2019/5/5,A-GP,AAA,8:31,17:04,8:50:37
2019/5/5,A-GP,BBB,8:48,18:40,11:43:57
2019/5/5,A-GP,CCC,8:30,22:34,7:34:01
2019/5/2,A-GP,AAA,8:51,19:10,8:23:09
2019/5/2,A-GP,BBB,8:52,23:28,10:33:02
そのためのコードとして、以下を作成しました
sub csv_add2() Dim a, c, cr, cv, d(), fa, fb, fc, i, p, so, t1, t2, x , pp '使用情報 - 入力ファイル fa = "csv_tmp2.csv" '利用時間情報 - 入力ファイル fb = "time_tmp2.csv" '出力フォーマット - 出力ファイル fc = "csv_tmp3.csv" Set so = CreateObject("Scripting.FileSystemObject") p = so.GetParentFolderName(WScript.ScriptFullName) Set cv = so.OpenTextFile(p & "\" & fb, 1) '利用時間情報をカンマ区切りで保持 t2 = Split(cv.ReadLine, ",") c = - 1 '利用時間情報のレコード数分実施 Do Until cv.AtEndOfStream '利用時間情報をカンマ区切りで保持 a = Split(cv.ReadLine, ",") c = c + 1 '利用時間情報を1レコードずつ読み込む ReDim Preserve d(3, c) For i = 0 to 3 d(i, c) = a(i) Next Loop cv.Close Set cv = Nothing Set cv = so.OpenTextFile(p & "\" & fa, 1) t1 = cv.ReadLine Set cr = so.OpenTextFile(p & "\" & fc, 2, True) 'ヘッダーを付与 cr.WriteLine "日付1,T_name,名前,ON1,OFF1,using_time" '使用情報のレコード数分実施 Do Until cv.AtEndOfStream x = cv.ReadLine '使用情報をカンマ区切りで保持 a = Split(x, ",") '使用情報より、使用するカラムを選択して順番を並べ替える pp = a(0) & "," & a(5) & "," & a(2) & "," & a(6) & "," & a(1) For i = 0 to c If a(4) = d(1, i) Then ' If a(4) = d(1, i) and a(0) = d(0, i) Then 'ここで、[日付]と[U_NO]に紐づけた[利用時間(using_time)]をレコードの最後につける cr.WriteLine pp & "," & d(3, i) Exit For End If Next Loop 'バッファを Flush してファイルを閉じる cv.Close cr.Close Set cv = Nothing Set cr = Nothing Set so = Nothing end sub
上記のコードで実施したことろ、以下のように出力されてしまい、
「目的としている結果」の値が出力できません
実出力csv(出力された結果):
日付1,T_name,名前,ON1,OFF1,using_time
2019/5/7,A-GP,AAA,8:29,8:30,"08:23:09"
2019/5/7,A-GP,BBB,8:49,8:51,"10:33:02"
2019/5/7,A-GP,CCC,8:38,11:26,"07:34:01"
2019/5/6,A-GP,AAA,8:28,17:04,"08:23:09"
2019/5/6,A-GP,BBB,8:49,17:58,"10:33:02"
2019/5/6,A-GP,CCC,8:36,19:21,"07:34:01"
2019/5/5,A-GP,AAA,8:31,17:04,"08:23:09"
2019/5/5,A-GP,BBB,8:48,18:40,"10:33:02"
2019/5/5,A-GP,CCC,8:30,22:34,"07:34:01"
2019/5/2,A-GP,BBB,8:51,19:10,"10:33:02"
2019/5/2,A-GP,CCC,8:52,23:28,"07:34:01"
できなかったこと:
①using_timeの値が、「名前」ごとにすべて同じ値になってしまっている
(time_tmp2.csvの各「名前」の最上位の「using_time」の値になっている)
②using_timeのフォーマットが「"hh:mm:ss"」になっている
コードを何度か見直して試してみたのですが、
狙った結果が取得できませんでした。
どのように修正すればいいのでしょうか?
お分かりになられるかた、
申し訳ございませんがご教授願います
追記、
コード内の
If a(4) = d(1, i) Then
' If a(4) = d(1, i) and a(0) = d(0, i) Then
の箇所ですが、
上側で実施すると、日付毎のソートがされず、
下側で実施すると、そもそも2つのcsvの結合に失敗する
(結合結果が0件となる)
という状況です
回答1件
あなたの回答
tips
プレビュー