【发布时间】: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 等。