Excel 如何将逗号分隔的字符串转换为二维数组
我有一个Excel 如何将逗号分隔的字符串转换为二维数组,excel,vba,Excel,Vba,我有一个csv文件,该文件以逗号分隔,带有Lf终止符,我想将其转换为二维数组以进行进一步处理。我成功地将文件读入字符串,并将行终止符从Lf修改为Cr,因为据我所知,vba无法将Lf识别为终止符。我想用这个字符串创建一个二维数组,在这里我还可以确定行和列的数量,因为原始的csv文件可以是任意大小的。csv文件也可以很大(>300MB和>1M个元素) 即使每个数据行的字符串中都有一个CR终止符,我也无法确定如何确定列数。下面的代码显示了我如何创建以逗号分隔的字符串,该字符串以Cr作为终止符 Open
csv
文件,该文件以逗号分隔,带有Lf
终止符,我想将其转换为二维数组以进行进一步处理。我成功地将文件读入字符串,并将行终止符从Lf
修改为Cr
,因为据我所知,vba无法将Lf
识别为终止符。我想用这个字符串创建一个二维数组,在这里我还可以确定行和列的数量,因为原始的csv
文件可以是任意大小的。csv
文件也可以很大(>300MB和>1M个元素)
即使每个数据行的字符串中都有一个CR
终止符,我也无法确定如何确定列数。下面的代码显示了我如何创建以逗号分隔的字符串,该字符串以Cr
作为终止符
Open fName For Binary As #1
Buf$ = String$(LOF(1), 0)
Get 1, , Buf$
Buf$ = Replace$(Buf$, vbLf, vbCr) ' Replace LF with CR
Close #1
我想要一个创建二维数组并计算行数和列数的方法或函数首先想到的是使用
InStr
(),它显示字符串中字符的位置。预先定义数组维度(数据集的最后一行);在简短的示例中,我将使用I
作为循环的迭代器)
然后对任一阵列使用单独的(sep)
arr(i,1) = left(Cells(i,1).value,sep-1)
arr(i,2) = right(Cells(i,1).value,len(cells(i,1))-sep+2) '2 characters in sep "b" and "s" so adding that back
我建议您对代码进行的更改是使用一些符号或字符串,而不是回车符,这样可以很容易地将其分开。我将尝试通过以下方式:
要调用的主函数 我将分隔符设置为可选,因此它不限于逗号 这不包括转义字符,如果需要,您必须添加转义字符
私有函数TextFileToArray(ByVal FilePath作为字符串,可选ByVal分隔符作为字符串=“,”)作为变量
'从文本文件读取内容
将文件内容设置为字符串
FileContent=ReadTextFile(文件路径)
'使用vbNewLine分隔行
将数据作为变量
SplitData=Split(FileContent,vbNewLine)
'通过拆分每个字符串来创建锯齿状数组
Dim JaggedArray作为变体
重播JaggedArray(LBound(分割数据,1)到UBound(分割数据,1))
暗指数与长指数相同
对于索引=LBound(拆分数据,1)到UBound(拆分数据,1)
JaggedArray(索引)=拆分(拆分数据(索引),分隔符)
下一个索引
'将锯齿阵列转换为二维阵列
TextFileToArray=jaggedarraytowimArray(JaggedArray)
端函数
读取文本文件的内容 这可以写在main函数中,但通常最好将代码分成更小的块
Public函数ReadTextFile(ByVal FilePath作为字符串)作为字符串
作为对象的Dim Fso
设置Fso=CreateObject(“Scripting.FileSystemObject”)
将T作为对象
设置Ts=Fso.OpenTextFile(FilePath,1,False)
ReadTextFile=Ts.ReadAll
端函数
将锯齿阵列转换为二维阵列 我已将边界存储在变量中,以便于调试和读取
私有函数jaggedarraytowodimarray(ByVal SourceArray作为变量)作为变量
“捕获边界
将LB1变长
LB1=LBound(源阵列,1)
将UB1变暗为等长
UB1=UBound(源阵列,1)
将LB2变长
LB2=LBound(源阵列(LB1),1)
Dim UB2
UB2=UBound(源阵列(UB1),1)
'设置返回数组的边界
Dim ReturnArray作为变体
ReDim返回阵列(LB1到UB1,LB2到UB2)
'从锯齿阵列填充二维阵列
变暗,变长
对于RowIndex=LB1到UB1
Dim ColIndex等长
对于ColIndex=LB2到UB2
ReturnArray(RowIndex,ColIndex)=SourceArray(RowIndex)(ColIndex)
下一个科林德斯
下一行索引
JaggedarraytoWodimArray=ReturnArray
端函数
请随意添加错误处理和可能需要的任何更改。我真的不知道您将获得什么样的执行速度,但是有String.Split函数。我认为您可以在CR上拆分字符串以生成一个数组,然后迭代该数组并用逗号拆分每个元素,从而构建多维数组。如果您的字段值可以包含逗号,那么您将有更多的工作要做。您是否尝试过直接在Excel中打开该文件?这将是最直接的方法。我可以尝试使用String.Split函数并测量性能,我也很关心这个性能,所以最初没有这样做。我尽量避免在单元格中读取或写入任何值,因为我知道这非常慢,而且我正在处理接近一百万个元素的大型数组。@XGeek您是否尝试过使用非标准符号(例如µ)替换,并使用TextToColumn将该符号用作分隔符
.TextToColumns Destination:=Range(“A1”)、DataType:=xlDelimited、Other:=True、OtherChar:=“µ”
使用该符号,我试图解析一个字符串变量,该变量是从一个用逗号分隔并以Cr作为行终止符的大型csv文件创建的。如果有帮助的话,我可以创建一个不同的行终止符。这个文件的目的是创建一个数组,其中包含大约300列,最后包含100行和数千行。我不知道如何使用InStr,因为有很多逗号delimeters,而且我不知道需要的数组的大小variable@XGeek您可以动态确定列/行(请参见)。这样,就可以创建一个数组
arr(i,1) = left(Cells(i,1).value,sep-1)
arr(i,2) = right(Cells(i,1).value,len(cells(i,1))-sep+2) '2 characters in sep "b" and "s" so adding that back