gpt4 book ai didi

vba excel FileSystemObject readline函数不读取完整行

转载 作者:行者123 更新时间:2023-12-04 20:43:50 26 4
gpt4 key购买 nike

我正在尝试编写一个宏来自动将 csv 文件导入我的工作簿。但是我遇到了解析分隔符的问题,特别是文件系统对象的 readline 方法在调用时没有读取完整的行

例子

csv中的一行:

  1,2,jack,"there can be many boys in the room"3,4,test,n.a

什么readline提取
1,2,jack,"there can be many

这会导致工作表最终像
1  |  2 | jack |there can be may
boys in the room| 3 | 4 | test | na

任何想法可能导致此问题?

谢谢

最佳答案

最合适的方法是按照 Pieter Geerkens 的建议处理和删除不可打印的字符,或者按照 Patrick 的建议阅读所有内容并拆分。但是,如果真的有一些意想不到的换行符,你最终可能会再次拥有太多的片段。

因此,这里有一个提示,如何让你的阅读在语义层面上更加健壮。

这个想法是读取一行并确定它是否是一整行:

...
var line as String
var lineFinished as boolean

' Loop starts here
...
lineFinished = false
...

' Read a line, or a piece of it.
linePiece = a.ReadLine ' or similar
...

' Now let's count the number of quotas:
dim cnt as integer
cnt = 0
for i=1 to len(line)
if mid(line, 0, i) = """" then
cnt = cnt + 1
end if
next

' If there is an odd number of quotas, the line is not finished:
lineFinished = (cnt mod 2 = 0) and (cnt > 0)

' If the line is finished, then take it as a full line. Otherwise, add the pieces up.
if lineFinished then
lineFinal = linePiece
else
lineFinal = lineFinal & linePiece
end if

...
' Then, use this place to clean the line from other nasty chars:
line = replace(line, "\n", "")
line = replace(line, "\r", "")
line = replace(line, "\t", "")
...

' Then, put your lineFinal to the whole string and reset the variable for the next loop.

我知道以这种方式替换和计数感觉非常笨拙。但不知何故,这是 VBA。像这样,您不需要正则表达式库,您可以通过添加行将您的体验直接添加到代码中。如果您发现一个新字符令人不安,只需将其添加到替换行中即可。

人们可能会讨论是否最好检查最后一行是否完成,而不是检查这些片段是否只是一行的一部分。但无论如何,如果您阅读一篇没有任何配额的非常小的文章(因此是 cnt > 0 ),您可能会有一些不确定性。但是,我们不要希望您的文件中毒了 ;-)

祝你好运。

编辑:

对于计数问题,也许更好的方法是计算逗号的数量 ,。 .因此,您可以相当精确地衡量您的生产线已经“完成”的程度。

关于vba excel FileSystemObject readline函数不读取完整行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24750930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com