質問: VBSを使用して、VBAで言うVLOOKUPのような処理を実現したいと思っています (VBAが使用できない理由は、マクロのタスク実行ができない(ログオフ状態で)ためです) 2つのcsvファイルを突き合わせて、指定の共通箇所をもとにファイルの結合をしたいと思っています 共通箇所は以下の通りです ・ファイルAの6カラム目の値 ・ファイルBの1カラム目の値 ・ファイルA: AAA,BBB,CCC,DDD,EEE,FFF SOS1,2019/3/10 10:15,〇,10:05,,1 SOS2,2019/3/10 10:18,〇,00:07,,2 SOS2,2019/3/10 10:11,〇,00:08,,2 SOS2,2019/3/10 10:03,〇,02:01,,2 SOS3,2019/3/10 10:15,〇,00:09,OK1,5 SOS4,2019/3/10 10:19,×,00:04,OK2,6 SOS4,2019/3/10 10:15,×,02:02,OK2,6 ・ファイルB: QQQ,WWW,TTT 1,東京,1位 2,神奈川,2位 3,埼玉,3位 4,千葉,4位 5,秋田,5位 6,青森,6位 ⇒結合後は、以下の通りとしたいです ・ファイルC AAA,BBB,CCC,DDD,EEE,FFF,WWW,TTT SOS1,2019/3/10 10:15,〇,10:05,,1,東京,1位 SOS2,2019/3/10 10:18,〇,00:07,,2,神奈川,2位 SOS2,2019/3/10 10:11,〇,00:08,,2,神奈川,2位 SOS2,2019/3/10 10:03,〇,02:01,,2,神奈川,2位 SOS3,2019/3/10 10:15,〇,00:09,OK1,5,秋田,5位 SOS4,2019/3/10 10:19,×,00:04,OK2,6,青森,6位 SOS4,2019/3/10 10:15,×,02:02,OK2,6,青森,6位 VBAならば、vlookupでFFFとQQQを突き合せれば何とかなりそうなのですが、 VBSで実現する場合、どのようにすればよいのでしょうか? お分かりになられる方、 申し訳ございませんがご教授いただけませんでしょうか
回答: ファイルBがマスタファイル的な感じなので、こちらのQQQをキーに連想配列化するのがよろしいかと。 あとはファイルAを読みながらFFFで連想配列を参照して、引っ張ってきたものと一緒にファイルAを出力すればよいですね。 ただファイルBの中身を全部メモリに読み込むことになるので、メモリを圧迫するほどのデータ量だと実用的ではないです。 ざっくりですが、コードを書いてみました。 エラー処理等は省いています。 ``` ' ファイルBを連想配列化 Set oFSO = WScript.CreateObject("Scripting.FileSystemObject") Set oFB = oFSO.OpenTextFile("fileB.csv") Set dicB = CreateObject("Scripting.Dictionary") Do While oFB.AtEndOfStream <> True line = oFB.ReadLine cols = Split(line, ",") key = cols(0) For i = 0 to Ubound(cols) - 2 cols(i) = cols(i+1) Next ReDim Preserve cols(Ubound(cols)-2) cols2 = Join(cols, ",") dicB.Add key, cols2 Loop oFB.Close ' ファイルAを読んでファイルCに出力 Set oFA = oFSO.OpenTextFile("fileA.csv") Set oFC = oFSO.OpenTextFile("fileC.csv") Do While oFA.AtEndOfStream <> True line = oFA.ReadLine cols = Split(line, ",") outline = line & "," & dicB.Item(cols(5)) oFC.WriteLine outline Loop oFA.Close oFC.Close ```