【问题标题】:Convert 900 Tables in Access to a CSV file将 Access 中的 900 个表转换为 CSV 文件
【发布时间】:2014-04-14 01:14:49
【问题描述】:

我有一个使用 Access 作为配方管理器的现有流程,并希望将其转换为可与 WonderWare 的内置配方管理器一起使用的 CSV。访问文件有900个表,每个表有8个字段。我关心的两个叫做 MachineTag 和 RecipeValue。我想将这些现有表格转换为 CSV(我将使用 excel 术语来解释):A 列将包含所有可能的 MachineTag。第 1 行将包含配方的名称(即现有 access 数据库中表的名称)。

Access 中的示例表:

CSV 文件示例:

希望这能解释我想要达到的目标。我有一个名为 MasterTag 的访问表,它指定了所有 MachineTag 可能性。如果食谱没有该标签,则可以在该字段中输入零。访问范围内每个表的记录数从 800 到 1200。(MasterTag,具有包含所有 1200 个可能标签的参考副本。)到目前为止,我的代码是使用 Debut.Print 生成 SQL 语句,然后我可以复制和粘贴在访问中的 SQL 中,它将起作用。我只是不知道如何将它们放在一起。

Sub GoMomma()
    Dim db As DAO.Database, 
        tb As DAO.TableDef

    Set db = CurrentDb()

    For Each tb In db.TableDefs
        If Left$(tb.Name, 4) <> "MSys" Then
            strSQL = "SELECT [MasterTag].MachineTag As TagName, [" & tb.Name & "].RecipeValue " & _
                     "FROM " & tb.Name & "INNER JOIN MasterTag ON ([" & tb.Name & "].MachineTag = [MasterTag].MachineTag)"
            Debug.Print strSQL
        End If
    Next tb
End Sub

我尝试了各种记录集和 FreeFile() 打印,保存到 txt/csv,但 freefile 方法的问题是它只会在末尾追加,而不是让每个都是一行。我使用记录集方法在 4 个多小时内取得了零进展。我尝试创建一个新的 tblTemp,只是在需要时即时使用,但没有运气。我没有所有的代码示例。我一度感到沮丧并关闭了我的笔记本电脑并丢失了一些工作。但实际上它无论如何都只是垃圾。

编辑: 我想到了一种防弹的方法来做到这一点,但还没有看过它的编码方面,只是在概念上它看起来很可靠。我可以制作一个 Excel 电子表格,第一行填写表格名称,第一列填写 MachineTags。在访问 vba 中,我将获取当前表名称和机器标签名称并搜索电子表格并找出插入 RecipeValue 所需的单元格(例如:B5),然后它将移动到该表中的下一个 MachineTag(如果未找到 MachineTag,插入新行,使用新 MachineTag),当该表完成后,移至下一个(表名将全部存在,因此我不需要检查和/或插入新的柱子)。从上面的屏幕截图中得到了一些解决:

一切都完成后,我可以将电子表格保存/转换为 CSV,然后我就完成了。周二很忙,所以可能要到周三才能开始工作,但至少在我看来,这似乎是一条可行的前进道路。 For my own records, possible solution / right direction, reminder to take a look at this.

【问题讨论】:

    标签: sql csv ms-access vba


    【解决方案1】:

    你很接近。也许这会有所帮助:创建一个临时表,然后遍历所有其他表并将记录插入临时表。然后您可以将临时表导出为 csv 文件。这是一些示例代码,基于您目前所拥有的。我省略了 MasterTag 表以使代码更简单(可能不需要它)。

    Sub GoMomma()
        Dim db As DAO.Database
        Dim tb As DAO.TableDef
        Dim strSQL As String
    
        Set db = CurrentDb()
    
        ' drop the temp table if it exists
        For Each tb In db.TableDefs
            If tb.Name = "recipe_temp" Then
                db.Execute "drop table recipe_temp"
            End If
        Next tb
    
        db.Execute "create table recipe_temp (RecipeName Text, MachineTag Text, RecipeValue Number)"
    
        For Each tb In db.TableDefs
            If Left$(tb.Name, 4) <> "MSys" And tb.Name <> "recipe_temp" Then
                strSQL = "INSERT INTO recipe_temp (RecipeName, MachineTag, RecipeValue) " & _
                         "SELECT """ & tb.Name & """ as RecipeName, MachineTag, RecipeValue " & _
                         "FROM " & tb.Name
                db.Execute strSQL
            End If
        Next tb
    
    End Sub
    

    【讨论】:

    • 谢谢。这正如你所期望的那样有效,但这并不是我所希望的。它将所有内容输出到我们创建的表中的新字段,将所有内容叠加在一起。我希望每个字段都以表名命名。在我上面的 csv 中,B1、C1、D1 是现有的表名。
    • 我在这里看到了一个类似的问题(关于我的部分场景):stackoverflow.com/questions/8116072/…
    • 更多研究告诉我,访问的列/字段的限制是 255,所以我的 900 个表将无法保存到一个表中,即使我知道如何执行上述操作.我可能会查看我拥有的一些旧日志解析器代码,看看它是否可以处理。这绝对不是一段简单的代码。
    猜你喜欢
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2020-03-07
    • 2013-06-21
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    相关资源
    最近更新 更多