导入带分隔符的文本
Posted
技术标签:
【中文标题】导入带分隔符的文本【英文标题】:Importing a text with separators 【发布时间】:2013-02-25 12:36:55 【问题描述】:我正在尝试自动添加具有相同(已知)布局的新文本文件。
使用制表符(TAB 按钮)分隔列。我的问题是,是否可以在 VBA 中执行此操作?比如,在用于导入文本文件的访问向导中?
我在 VBA 中使用DoCmd.TransferText
方法
【问题讨论】:
开始这种过程的最简单方法是在 excel/access 或其他任何方式中记录您手动执行的宏,然后获取生成的 VBA 并将其概括为输入参数等。跨度> @JonEgerton 我不相信你可以在 Access 中录制宏。 不,但您应该能够在 Excel 中这样做,然后将生成的 VB 重新使用到您的代码中 - 对象模型将可用(只要您拉入正确的引用) . @JonEgerton 除非您通过 Excel VBA 打开 Access 表,否则您将无法访问表。另外,当可以在 Access 中本地完成时,为什么要在 Excel 中编写它并在 Access 中使用 Excel 引用?我理解尝试通过录制宏来简化,但在这种情况下可能会进一步混淆问题。 【参考方案1】:您需要完成一次向导来制作规范文件。为此,请像往常一样导入您的文本文件,但在深入了解向导之前,请单击左下角的“高级...”按钮。这是您制作规范文件的地方。
使所有这些列与您的输入文件、数据类型和所有内容相匹配。请务必选择 tab
字段分隔符和适当的文本限定符(如果您正在使用)。
保存您的规范(稍后可以通过返回同一屏幕并单击 Specs...
然后保存旧规范来进行编辑)
现在你可以像这样在 VBA 中使用
DoCmd.TransferText acImportDelim, "your spec name", "destination table name", sourceFilePath
有一个参数HasFieldNames
,您必须根据您的文件来决定它是true
还是false
。
【讨论】:
从技术上讲,您还可以使用更新的导入/导出配置文件 API 从 XML 组装自己的 I/O 规范。这很棘手,但有可能——我以前自己做过。见ImportExportSpecification、The New Import/Export Specification OM、The New Import/Export Specifications UI @JoshuaHonig 自己制作有什么好处?映射是否比这种方法“更好”?这是一个非常快的过程,不是吗? 您可以在运行时动态创建规范。有时这是必要的,尤其是在将应用程序分发给其他人的情况下。 我已经使用以下代码进行了尝试:DoCmd.TransferText acImportDelim, "Tags_AI_DB_Importspecificatie", "Tags_AI_DB", "C:\Data\PLC_MOBZ\Test\Scada_DBs\Tags_AI_DB.txt", True
(使用第一行作为字段名称的“True”,但由于某种原因,这使得访问只是删除第一行,而是调用“row1、row2、row3、row4 等”列【参考方案2】:
使用导入向导的缺点是,即使文件格式发生最轻微的变化,您也必须再次单击所有这些步骤才能使导入工作。
查看@Remou 在ms Access import table from file in a query 中的回答,以了解在直接 SQL 中执行此操作的方法。我实际上在我的一个项目中使用了相同的方法。我使用这样的东西(有关详细信息,请参阅我的链接):
insert into MyTable (column-list...)
select (column-list...)
from [data-source-specifications].[file-name]
any-other-clauses...;
只有一个警告。如果将此 SQL 语法放入普通的 Access 查询对象中,Access 很有可能会将其破坏到甚至无法打开查询对象的程度。因此,当您在 Access 中试用时,将查询编写并保存在文本文件中。一旦查询被测试并工作,将其保存在 VBA 子例程中,以便 Access 将完全按原样运行它,如下所示:
sub MyTableImport()
sqlStr = " insert into MyTable (column-list) " ' leave a space at the
sqlStr = sqlStr & "select (column-list...) " ' end of each line of the string
sqlStr = sqlStr & "from [data-source-specifications].[file-name] "
sqlStr = sqlStr & "any-other-clauses... ;"
DoCmd.RunSQL sqlStr
end sub
【讨论】:
以上是关于导入带分隔符的文本的主要内容,如果未能解决你的问题,请参考以下文章