如何解决是否有与C的sscanf类似的VB6函数?
| 我正在尝试读取由以下几种形式的文本行组成的文件...first value 1352.2 second value 12 third value 32323
first value 1233.2 second value 22 third value 23333
first value 1233.1 second value 21 third value 64344
因此,我正在寻找一种类似于fscanf或sscanf的函数,以一次性检查每一行。是否有这样的功能,或者我必须手动将每一行分开(有几种不同的行)。
解决方法
虽然MarkJ为您提供了VB6的处理方式,但您可能需要查看FWIW:
http://www.freevbcode.com/ShowCode.asp?ID=3806
\“在VB中实现的C字符串函数SScanf和StrTok \”
它实现了一个功能ScanString(),该功能应该是sscanf()的仿真。
, 没有equivalent1的等价物。我只是使用Mid()手动将线分开。这很容易。
Mid(string,start,length)
将返回一个子字符串,从字符start
开始,长度为length
个字符。
start
从1开始-字符串中的第一个字符为数字1。
仔细考虑start
和length
。如果文件包含很大的数字,它将是什么样?该数字可能会进一步向左延伸(如果数字在文件中右对齐,这在我的经验中很常见-您的里程可能会有所不同)。
使用Val
将子字符串转换为数字
Val始终使用点作为小数点分隔符-这是您所需要的吗?
我个人会避免输入#。 ѭ9用于读取使用ѭ10从VB6写入的文件。如果尝试使用Input #
读取任意文件格式,则可能会遇到奇怪的情况。
, 给定这样的文件,您可以使用任意方法逐行读取文件,然后使用Trim
和Split
函数为每行创建一个由空格分隔的字符串的字符串数组。然后通过保留从IsNumeric
函数返回True
的那些元素来解析所得数组中的数字:
将其放在立即窗口中以查看其工作方式:
s = Split(Trim(\"first value 1352.2 second value 12 third value 32323\"))
For x = LBound(s) To UBound(s): _
? \"\'\",x,s(x),IsNumeric(s(x)): _
Next x
在Next x
之后按Enter键时,您会看到以下内容,其中每个数字后面都带有一个“ True”:
\' 0 first False
\' 1 value False
\' 2 1352.2 True
\' 3 False
\' 4 False
\' 5 False
\' 6 False
\' 7 False
\' 8 second False
\' 9 value False
\' 10 False
\' 11 False
\' 12 False
\' 13 False
\' 14 12 True
\' 15 False
\' 16 False
\' 17 False
\' 18 False
\' 19 False
\' 20 third False
\' 21 value False
\' 22 False
\' 23 False
\' 24 False
\' 25 32323 True
注意:我在每个打印行上都使用了双引号,这样语法突出显示不会与输出混淆。
, 在大多数情况下,Input语句应该足够了(也许具有某种逻辑来检测行的类型并调用相关的输入语句)。
在VB6中对不同的文件IO命令进行了相当全面的检查,其中有一些不错的示例,这些示例在此处读取了文件固定的“'COBOL样式\'”。
如果您处理的是Input无法处理的奇怪或不一致的格式,那么您可以手动分拆。因为您提到了不同的格式,所以这可能是最好的选择。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。