-->

不打开文件CSV文件,以阵列的负载内容[关闭](Load contents of CSV file

2019-08-16 23:52发布

我有一个要求,在6000 CSV文件整理成一个CSV文件。 当前VBA过程是:1.打开个人CSV数据文件基于3.关闭个别CSV文件4.流程阵列的行数文件,以阵列的2.加载内容

为了提高代码和处理的效率,我希望有可能是从所述个体的CSV文件数据加载到阵列时不开口的方法和关闭每一个文件。

我使用Excel 2011的Mac。

Answer 1:

好吧,我假设所有的6000个文件具有相同的格式。

我的测试条件

  1. 我有一个文件夹名为C:其中有6000个CSV文件的\ Temp \
  2. 所有CSV文件有40行和16列
  3. 测试它在Excel 2010中不要有机会获得2011年将在大约30分钟测试它于2011年。

我跑到下面的代码和代码只花了4秒。

Option Explicit

Sub Sample()
    Dim strFolder As String, strFile As String
    Dim MyData As String, strData() As String
    Dim FinalArray() As String
    Dim StartTime As String, endTime As String
    Dim n As Long, j As Long, i As Long

    strFolder = "C:\Temp\"

    strFile = Dir(strFolder & "*.csv")

    n = 0

    StartTime = Now

    Do While strFile <> ""
        Open strFolder & strFile For Binary As #1
        MyData = Space$(LOF(1))
        Get #1, , MyData
        Close #1

        strData() = Split(MyData, vbCrLf)
        ReDim Preserve FinalArray(j + UBound(strData) + 1)
        j = UBound(FinalArray)

        For i = LBound(strData) To UBound(strData)
            FinalArray(n) = strData(i)
            n = n + 1
        Next i

        strFile = Dir
    Loop

    endTime = Now

    Debug.Print "Process started at : " & StartTime
    Debug.Print "Process ended at : " & endTime
    Debug.Print UBound(FinalArray)
End Sub

该文件夹的截图

编码输出的屏幕截图


UPDATE

确定我在MAC测试它

我的测试条件

  1. 我有一个在桌面上称为示例文件夹其中有1024个CSV文件
  2. 所有CSV文件有40行和16列
  3. 在Excel 2011进行了测试。

我跑到下面的代码和代码只用了不到1秒(因为当时只有1024文件)。 因此,我期待它的情况下,4秒再次运行有6K文件

Sub Sample()
    Dim strFile As String
    Dim MyData As String, strData() As String
    Dim FinalArray() As String
    Dim StartTime As String, endTime As String
    Dim n As Long, j As Long, i As Long

    StartTime = Now

    MyDir = ActiveWorkbook.Path
    strPath = MyDir & ":"

    strFile = Dir(strPath, MacID("TEXT"))

    'Loop through each file in the folder
    Do While Len(strFile) > 0
        If Right(strFile, 3) = "csv" Then
            Open strFile For Binary As #1
            MyData = Space$(LOF(1))
            Get #1, , MyData
            Close #1

            strData() = Split(MyData, vbCrLf)
            ReDim Preserve FinalArray(j + UBound(strData) + 1)
            j = UBound(FinalArray)

            For i = LBound(strData) To UBound(strData)
                FinalArray(n) = strData(i)
                n = n + 1
            Next i

            strFile = Dir
        End If
        strFile = Dir
    Loop

    endTime = Now

    Debug.Print "Process started at : " & StartTime
    Debug.Print "Process ended at : " & endTime
    Debug.Print UBound(FinalArray)
End Sub

该文件夹的截图

编码输出的屏幕截图



Answer 2:

你并不需要使用Excel来做到这一点,你可以使用Windows从通过输入命令提示符下副本的合并:

copy *.csv mergedfilename.csv


Answer 3:

这里没有一个Excel回答你的问题,在我看来 - 这当然不是正常定义其内,无论如何。

解决这个问题的正确方法是使用一种编程语言,是适当的任务; Perl中,例如,甚至命令外壳,结合文件。 Excel中不恒定文件进行I / O,但Perl是在处理大量文件的相当不错。 我执行一个类似的项目相对较小的Unix服务器上(合并数百万个文件),在几分钟内。

您还可以使用命令shell猫的文件一起(猫=串连),如nneonneo的意见建议; 我不能说这是更快。 Perl中肯定会需要更长的时间代码,特别是如果你必须先学Perl(虽然有很多的例子在净)。



文章来源: Load contents of CSV file to array without opening file [closed]