0

我目前正在重建一个 excel 宏,它解析文本文件并根据特定规则集填充 Excel 工作表中的单元格。我的新版本应该每天处理更长的时间跨度的文件,而不是一周的总结结果。但是,似乎自从我得到这些较大的文件后,拆分命令就不会返回任何内容。

    rawDataArray = Split(rawData, Chr$(10))

在逐步浏览时,我可以清楚地看到 rawData 字符串包含我从源文本文件加载的数据,我还在十六进制编辑器中打开了该文件,以验证 chr(10) 是否存在。执行操作后,rawDataArray 仍然为空。

以前的版本只处理最多几千个字符的文本文件,而且运行完美。当前文件大约有 500.000 个字符长,这是唯一(嗯,第一个;))行不起作用,这让我想到 split 命令可以处理的字符串长度可能存在上限。这可能是真的吗?如果是这样,它有多长?

也可能是因为我们在我的办公室从 Office 2007 切换到了 Office 2010?我不知道 vbscript 版本的行为是否相同,我想这也可能是一个因素。

提前非常感谢!

编辑:我不确定是否习惯用解决方案回答您自己的帖子,但是,这里有。

似乎 split 命令无法处理这么大的字符串,我试图将文件减少到 ~7k 字符并且有效。我还没有找到确切的数字,但至少这似乎是原因。另外,感谢 Avner 对 vbscript 与 VBA 的更正,在编程/脚本方面我是自学的,所以现在我学到了一些新东西!

感谢 Avner 的更正

4

2 回答 2

1

Excel 宏是用 VBA 而非 VBScript 编写的。VBA 的限制对您来说应该不是问题。如果有的话,您的计算机的 RAM 可能是一个限制。这是来自 Office 2010 的VBA 文档,对于 Office 2007 也是如此:

字符串有两种:可变长度字符串和固定长度字符串。

  • 可变长度字符串最多可包含大约 20 亿 (2^31) 个字符。
  • 一个固定长度的字符串可以包含 1 到大约 64K (2^16) 个字符。

我猜问题是该Split方法不能很好地处理大字符串。也许最好Mid在循环中使用将其拆分为块,然后Split单独调用,尽管这还有其他问题。

于 2012-08-19T12:53:20.263 回答
0

Split 可以处理任意大小的字符串。我刚刚用一个简单的 sub 检查了 split 函数(在 Excel 2010 中,但我认为 2007 应该是一样的)

Public Sub TestSplit()

    Dim Count As Long
    Count = 1000000

    Dim x
    ReDim x(Count)

    Dim i As Long
    For i = 1 To Count
        x(i) = "My String " & i
    Next

    Dim RawString As String
    RawString = Join(x, Chr(10))

    Debug.Print "RawString length = " & Len(RawString)

    Dim SplitArray
    SplitArray = Split(RawString, Chr(10))

    Debug.Assert UBound(SplitArray) = Count

End Sub

Output:
RawString length = 16888896

阅读您的源文件必须有一些东西。您确定 rawData 变量中有 chr(10) 字符吗?我建议你用 instr 函数检查它:

InStr(RawString, Chr(10))

它应该大于 0。但即使在这种情况下,rawDataArray 也应该包含一个元素和整个 rawData 字符串。

于 2012-08-20T11:06:35.007 回答