2017-09-20 2 views
3

Date、Open、High、Low、Closeの2つのcsvファイルがあります。両方のcsvファイルの日付列が異なる日付から開始し、csvのいずれかが別のcsvの日付値を持たないことがあります。VB6で一致する値に基づいて2つのCSVファイルをマージする方法

ここでは、これらの2つのcsvファイルを、両方のcsvの日付値と値が一致する単一のcsvに結合したいと考えています。 csvのいずれかに別のcsvの日付値がない場合、その特定の日付の欠損値には0を割り当てる必要があります。

ソース1 Source1

ソース2 Source2

予想される出力 Expected Output

+0

これは宿題ですか?どの部分が正確に問題を抱えていますか?私にとっては非常に簡単なもののように聞こえる。 –

+0

Excelアプリケーションオブジェクトを使用せずに実装したいです。私はそれをExcelのアプリケーションオブジェクトを使用して行うことができます。 –

答えて

4

Implementing the Equivalent of a FULL OUTER JOIN in Microsoft Accessを参照してください。私はかつて私のa.txtb.txtサンプル入力ファイルからc4steps.txt、その後c.txtを出力し、これを2回行っている

Option Explicit 

'Implementing the Equivalent of a FULL OUTER JOIN in Microsoft Jet SQL. 

Private Sub Main() 
    'We'll do our work in App.Path, where our input files are: 
    ChDir App.Path 
    ChDrive App.Path 
    'Clean up from any prior test run: 
    On Error Resume Next 
    Kill "inner.txt" 
    Kill "left.txt" 
    Kill "right.txt" 
    Kill "c4steps.txt" 
    Kill "c.txt" 
    Kill "schema.ini" 
    On Error GoTo 0 
    With New ADODB.Connection 
     .Open "Provider=Microsoft.Jet.OLEDB.4.0;" _ 
      & "Data Source='.';" _ 
      & "Extended Properties='Text;Hdr=No'" 
     'Do it in 4 steps for illustration: 
     .Execute "SELECT [A].*, [B].[F2], [B].[F3], [B].[F4] " _ 
       & "INTO [inner.txt] FROM " _ 
       & "[a.txt] [A] INNER JOIN [b.txt] [B] ON " _ 
       & "[A].[F1] = [B].[F1]", _ 
       , _ 
       adCmdText Or adExecuteNoRecords 
     .Execute "SELECT [A].*, 0 AS [B_F2], 0 AS [B_F3], 0 AS [B_F4] " _ 
       & "INTO [left.txt] FROM " _ 
       & "[a.txt] [A] LEFT JOIN [b.txt] [B] ON " _ 
       & "[A].[F1] = [B].[F1] " _ 
       & "WHERE [B].[F1] IS NULL", _ 
       , _ 
       adCmdText Or adExecuteNoRecords 
     .Execute "SELECT [B].[F1], 0 AS [A_F2], 0 AS [A_F3], 0 AS [A_F4], " _ 
       & "[B].[F2], [B].[F3], [B].[F4] " _ 
       & "INTO [right.txt] FROM " _ 
       & "[a.txt] [A] RIGHT JOIN [b.txt] [B] ON " _ 
       & "[A].[F1] = [B].[F1] " _ 
       & "WHERE [A].[F1] IS NULL", _ 
       , _ 
       adCmdText Or adExecuteNoRecords 
     .Execute "SELECT * " _ 
       & "INTO [c4steps.txt] FROM (" _ 
       & "SELECT * FROM [inner.txt] UNION ALL " _ 
       & "SELECT * FROM [left.txt] UNION ALL " _ 
       & "SELECT * FROM [right.txt]) " _ 
       & "ORDER BY [F1]", _ 
       , _ 
       adCmdText Or adExecuteNoRecords 
     'Do it all in one go: 
     .Execute "SELECT * " _ 
       & "INTO [c.txt] FROM (" _ 
       & "SELECT [A].*, [B].[F2], [B].[F3], [B].[F4] " _ 
       & "FROM [a.txt] [A] INNER JOIN [b.txt] [B] ON " _ 
       & "[A].[F1] = [B].[F1] UNION ALL " _ 
       & "SELECT [A].*, 0 AS [B_F2], 0 AS [B_F3], 0 AS [B_F4] " _ 
       & "FROM [a.txt] [A] LEFT JOIN [b.txt] [B] ON " _ 
       & "[A].[F1] = [B].[F1] " _ 
       & "WHERE [B].[F1] IS NULL UNION ALL " _ 
       & "SELECT [B].[F1], 0 AS [A_F2], 0 AS [A_F3], 0 AS [A_F4], " _ 
       & "[B].[F2], [B].[F3], [B].[F4] " _ 
       & "FROM [a.txt] [A] RIGHT JOIN [b.txt] [B] ON " _ 
       & "[A].[F1] = [B].[F1] " _ 
       & "WHERE [A].[F1] IS NULL) " _ 
       & "ORDER BY [F1]", _ 
       , _ 
       adCmdText Or adExecuteNoRecords 
     .Close 
    End With 
    MsgBox "Done" 
End Sub 

注:ここでは

は簡単なデモです。 AとBは入力ファイルのエイリアスですが、実際のファイル名もスペルである可能性があります。

列名F1、F2、A_F1、B_F2などは、Jet Text IISAMによって生成されるデフォルト名です。もう少し努力すれば、実行の前に適切に形成されたschema.iniより意味のある列名を使用することができました。

生成されたschema.iniをブラウズすると、何が起こっているのか理解するのに役立ちます。

a.txt

1901,1,1,1 
1902,2,2,2 
1904,4,4,4 
1906,6,6,6 
1908,8,8,8 

b.txt

1901,11,11,11 
1902,12,12,12 
1903,13,13,13 
1904,14,14,14 
1905,15,15,15 
1906,16,16,16 

c.txt

1901,1,1,1,11,11,11 
1902,2,2,2,12,12,12 
1903,0,0,0,13,13,13 
1904,4,4,4,14,14,14 
1905,0,0,0,15,15,15 
1906,6,6,6,16,16,16 
1908,8,8,8,0,0,0 
+0

ありがとう@ Bob77。これは、Microsoft Excelをインストールする必要はありませんが、同時にAccessデータベースエンジンをインストールする必要があります。右? –

+0

Excelを使用していないため、Jet 4.0エンジンはWindowsの一部であるため、アクセスは必要ありません。 – Bob77

+0

ああ..お返事ありがとうございます。私は後であなたの実装に入るときにあなたに知らせます –

関連する問題