【问题标题】:Is there a more efficient way to parse a fixed txt file in Access than using queries?有没有比使用查询更有效的方法来解析 Access 中的固定 txt 文件?
【发布时间】:2020-08-26 11:36:51
【问题描述】:

我有一些带有多种规范格式的大型文本文件。我需要根据文件中设置位置的字符来解析 txt 文件。该字符在文件中可以有不同的位置。

我已经为每个不同的规范(其中 95 个)编写了查询,使用带有 WHERE() 函数的 mid() 函数将起始位置和长度硬编码到查询中,以从规格。正如您在下面看到的,WHERE() 函数中的 2 个规范在 txt 文件中的位置不同。

\\\
SELECT Mid([AllData],1,5) AS PlanNumber, Mid([AllData],6,4) AS Spaces1, Mid([AllData],10,3) AS Filler1, Mid([AllData],13,11) AS SSN, Mid([AllData],24,1) AS AccountIdentifier, Mid([AllData],25,5) AS Filler2, Mid([AllData],30,2) AS RecordIdentifier, Mid([AllData],32,1) AS FieldType, Mid([AllData],33,4) AS Filler3, Mid([AllData],37,8) AS HireDate, Mid([AllData],45,8) AS ParticipationDate, Mid([AllData],53,8) AS VestinDate, Mid([AllData],61,8) AS DateOfBirth, Mid([AllData],77,1) AS Spaces2, Mid([AllData],78,1) AS Reserved1, Mid([AllData],79,1) AS Reserved2, Mid([AllData],80,1) AS Spaces3
FROM TBL_Company1
WHERE (((Mid([AllData],30,2))="02") AND ((Mid([AllData],32,1))="D"));
\\\
Or 

\\\
SELECT Mid([AllData],1,5) AS PlanNumber, Mid([AllData],6,4) AS Spaces1, Mid([AllData],10,3) AS Filler1, Mid([AllData],13,11) AS SSN, Mid([AllData],24,1) AS AccountIdentifier, Mid([AllData],25,7) AS RecordIdentifier, Mid([AllData],32,22) AS StreetAddressForBank, Mid([AllData],54,20) AS CityForBank, Mid([AllData],74,2) AS StateForBank, Mid([AllData],76,5) AS ZipCodeForBank
FROM TBL_Company1
WHERE (((Mid([AllData],25,7))="49EFTAD"));
\\\

有没有办法解析出这个,而不必将每个位置和长度都硬编码到代码中?

我正在考虑创建一个包含所有规范的表,并使用导入函数查看规范表并将数据相应地解析为新表或其他表。

我所做的可扩展性不是很好,如果格式稍有变化,我将不得不返回每个查询进行更改。

非常感谢任何帮助

【问题讨论】:

  • 当然,您可以将此规范存储在一个表中,然后在 VBA 中构建查询。但这几乎没有效率。理想情况下,您有一种方法可以推断或查找格式,而无需手动编程。
  • 请显示示例文本文件来说明您的问题。很好奇这是不是XY Problem。您可能在谈论 XML、JSON、YAML 等。

标签: sql vba ms-access


【解决方案1】:

我认为在您的情况下,我希望能够按照您的建议动态生成 SQL 语句。

我会有一张类似这样的桌子:

Format#,Position,OutColName,FromPos,Length,WhereValue
1,1,"PlanNumber",1,5,
1,2,"Spaces1",6,4,
...
1,n,,30,2,"02"
1,n+1,,32,1"D"

然后是一些 VBA 来处理它并构建和执行 SQL 字符串。 SELECT 子句条目将通过 OutColName 字段中的值来识别,而 WHERE 子句条目将通过 WhereValue 列中的值来识别。

当然,这只是更“有效”,因为它更容易编写新格式或修复/修改现有格式。

【讨论】:

  • 你是对的,这就是我想要做的。我只是不知道如何动态地做到这一点。如何让 sql 引用 [Specs] 表以动态过滤导入的 [AllData]Txt 表,其中输出列名来自 (OutColName) 的 [Specs] 表?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多