【问题标题】:How to Merge two CSV file based on matching value in VB6如何在VB6中根据匹配值合并两个CSV文件
【发布时间】:2017-09-20 11:32:49
【问题描述】:

我有两个 csv 文件,其中包含 Date、Open、High、Low 和 Close 列。两个 csv 文件的日期列可能从不同的日期开始,并且任何一个 csv 可能没有另一个 csv 的日期值。

在这里,我想将这两个 csv 文件组合成单个 csv,并具有匹配的日期值和两个 csv 的关闭值。并且任何 csv 可能没有另一个 csv 的日期值,那么该特定日期的那些缺失值应分配为 0。请参阅下图。

来源 1

来源 2

预期输出

【问题讨论】:

  • 这是家庭作业吗?你到底在哪方面有问题?听起来对我来说是一件非常简单直接的事情。
  • 我想在不使用excel应用对象的情况下实现。我可以使用 excel 应用程序对象来做到这一点。

标签: csv vb6


【解决方案1】:

Implementing the Equivalent of a FULL OUTER JOIN in Microsoft Access

这是一个简短的演示:

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

请注意,我已经这样做了两次,一次输出c4steps.txt,然后从我的a.txtb.txt 示例输入文件中输出c.txt。 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

【讨论】:

  • 谢谢@Bob77。这是不需要安装Microsoft Excel 同时需要安装Access 数据库引擎。对吗?
  • 它不使用 Excel,Jet 4.0 引擎是 Windows 的一部分,因此也不需要 Access。
  • 哦.. 感谢您的快速回复。一旦我完成你的实施,我会在稍后通知你
  • 联合所有时出现错误。因为,我的表关闭值可能包含小数位。
  • 谢谢!!!您的代码只需稍加修改即可完美运行。干杯!编码愉快!
猜你喜欢
  • 1970-01-01
  • 2019-06-28
  • 2015-01-30
  • 2016-10-19
  • 2012-03-28
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多