在 vba 中手动创建制表符分隔的文本文件

Posted

技术标签:

【中文标题】在 vba 中手动创建制表符分隔的文本文件【英文标题】:Creating a Tab Delimited Text File Manually in vba 【发布时间】:2019-09-08 05:50:04 【问题描述】:

我正在尝试在 Access 中使用 vba 创建制表符分隔的文本文件。这个文件本质上是从表中读取数据,并且在文件的开头有一些文本字符串。这样做的目的是创建一个可以在其他软件 (Autodesk Revit) 中读取的共享参数文本文件

我遇到的问题是我导出的文件似乎不是制表符分隔的文件。我可以通过尝试将其导入 excel 来测试它,它不会将其识别为制表符分隔文件。

下面的 sn-p 显示了我编写的代码。运行它然后尝试在 Excel 中导入,表明它不是作为制表符分隔的文件读取的。为方便起见,我已将读取数据库的部分注释掉,因为它与实际问题无关。

Public Function ExportRevitSharedParameterFile()

    Dim rst As DAO.Recordset

    Dim header As String
    Dim metaHeader As String
    Dim groupHeader As String
    Dim paramHeader As String

    Dim metaData As String
    Dim groupData As String
    Dim paramData As String

    header = "# This is a Revit shared parameter file." & vbCrLf & "# Do not edit manually."
    metaHeader = "*META" & vbTab & "VERSION" & vbTab & "MINVERSION"
    groupHeader = "*GROUP" & vbTab & "ID" & vbTab & "NAME"
    paramHeader = "*PARAM" & vbTab & "GUID" & vbTab & "NAME" & vbTab & "DATATYPE" & vbTab & "DATACATEGORY" & vbTab & "GROUP" & vbTab & "VISIBLE" & vbTab & "DESCRIPTION" & vbTab & "USERMODIFIABLE"

    Set fs = CreateObject("Scripting.FileSystemObject")

    ' This path may need to be changed to an appropriate location with permission access
    Set a = fs.CreateTextFile("C:\sp.txt", True, True)

    a.WriteLine (header)
    a.WriteLine (metaHeader)

    metaData = "META" & vbTab & "2" & vbTab & "1"
    a.WriteLine (metaData)

    a.WriteLine (groupHeader)
    'Write some data from an access table
    'Set rst = CurrentDb.OpenRecordset("SP File - Groups", dbOpenSnapshot)
    'Do While Not rst.EOF
    '    groupData = "GROUP" & vbTab & rst![Group ID] & vbTab & rst![Group Name]
    '    a.WriteLine (groupData)
    '    rst.MoveNext
    'Loop
    'rst.Close
    'Set rst = Nothing

    a.WriteLine (paramHeader)
    'Write some data from an access table
    'Set rst = CurrentDb.OpenRecordset("SP File - Parameters", dbOpenSnapshot)
    'Do While Not rst.EOF
    '    paramData = "PARAM" & vbTab & rst![Parameter GUID] & vbTab & rst!Name & vbTab & rst![Revit Type] & vbTab & "" & vbTab & rst![Group ID] & vbTab & "1" & vbTab & "" & vbTab & "1"
    '    a.WriteLine (paramData)
    '    rst.MoveNext
    'Loop
    'rst.Close
    'Set rst = Nothing

    a.Close

End Function

对此的任何帮助将不胜感激。我显然遗漏了一些关于如何创建制表符分隔文件的信息。

【问题讨论】:

【参考方案1】:

“常规”制表符分隔值 (TSV) 文件如下所示,列数恒定:

+------+------+------+
| Col1 | Col2 | Col3 |
+------+------+------+
| Data | Data | Data |
| Data | Data | Data |
+------+------+------+

您的文件以其中没有 TAB 的两行开头:

header = "# This is a Revit shared parameter file." & vbCrLf & "# Do not edit manually."

在确定文本文件的结构时,Excel 会查看前几行(我认为是 5 或 10 行)和扩展名。在您的情况下,该文件被识别为“纯文本”。

为了使 Excel 将您的文件识别为 TSV,请尝试以下操作:

删除前两行

和/或

将其从 .txt 重命名为 .tsv

Excel 可能仍然不喜欢您拥有不同列数的不同块(META / GROUP / PARAM)这一事实。

但真正的测试当然是:目标软件 (Autodesk) 是否可以使用该文件?

【讨论】:

谢谢!这对于理解为什么我在某些情况下让它与 excel 一起工作非常有帮助,具体取决于我导出到文件的内容。它最初在软件中不起作用。但是,由于您在上面的解释,我开始更仔细地查看文件应该读取的内容并发现错误。干杯

以上是关于在 vba 中手动创建制表符分隔的文本文件的主要内容,如果未能解决你的问题,请参考以下文章

查询带有标题的制表符分隔的文本文件时出现 VBA 错误 - “没有为一个或多个必需参数提供值”

如何将制表符分隔的文本文件导入 Excel?

在 VBA 中使用文件对话框

将包含超过255个字段的制表符分隔文本文件导入两个访问表的工作代码

对文本文件中制表符分隔列中的文本进行分类

在 Spark R 中读取制表符分隔的文本文件