Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何将逗号分隔的字符串转换为二维数组_Excel_Vba - Fatal编程技术网

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

我建议您对代码进行的更改是使用一些符号或字符串,而不是回车符,这样可以很容易地将其分开。

我将尝试通过以下方式:

  • 首先使用vbNewLine将数据拆分为行
  • 然后循环分割数组,并使用逗号分隔符分割每个迭代。留下一个锯齿状数组(包含数组的数组)
  • 最后,您现在有了二维阵列的尺寸,可以通过ReDim和循环来添加所有数据
  • 出于抽象目的,我将此任务分为三个单独的函数


    要调用的主函数 我将分隔符设置为可选,因此它不限于逗号

    这不包括转义字符,如果需要,您必须添加转义字符

    私有函数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