Загрузка содержимого файла CSV в массив без открытия файла [закрыто]

У меня есть требование собрать более 6000 файлов CSV в один документ CSV. Текущий процесс VBA: 1. Откройте отдельный файл данных CSV 2. Загрузите содержимое файла в массив на основе количества строк 3. Закройте отдельный файл CSV 4. Массив процесса

Чтобы повысить эффективность кода и обработки, я надеялся, что может быть способ загрузки данных из отдельных файлов CSV в массив без открытия и закрытия каждого отдельного файла.

Я использую Excel 2011 для Mac.

 Benny Muller18 февр. 2013 г., 15:48
Да, все форматы CSV имеют одинаковый формат, хотя количество строк в каждом файле различно.
 nneonneo16 февр. 2013 г., 08:16
Может простоcat > one_big_csv_file? `
 Siddharth Rout16 февр. 2013 г., 12:14
Все ли CSV-файлы в одном формате?

Ответы на вопрос(3)

Ты ненеобходимость чтобы использовать Excel для этого, вы можете объединить, используя Windows Copy из командной строки, введя:

copy *.csv mergedfilename.csv
 Ahmed AbdelKhalek23 окт. 2017 г., 15:21
Он также скопирует заголовки.

Мои условия испытаний

У меня есть папка с именем C: \ Temp \, которая имеет 6000 файлов CSVВсе CSV-файлы имеют 40 строк и 16 столбцовПротестировано в Excel 2010.у него есть доступ к 2011 году. Будет тестировать его в 2011 году примерно через 30 минут.

Я запустил приведенный ниже код, и он занял всего 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

Скриншот папки

Снимок экрана с выводом кода

ОБНОВИТЬ

Хорошо, я проверил это в MAC

Мои условия испытаний

У меня на рабочем столе есть папка Sample с 1024 CSV-файлами.Все CSV-файлы имеют 40 строк и 16 столбцовПротестировано в 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

Скриншот папки

Снимок экрана с выводом кода

 Benny Muller21 февр. 2013 г., 00:04
Привет, Сиддхарт, я проверил предложенный код, и цикл никогда не вводится, так как strFile имеет значение "", Рабочая книга сохраняется в папке соответствующих файлов CSV.
 Benny Muller18 февр. 2013 г., 15:50
Спасибо, Сиддхарт, это выглядит как очень исчерпывающий ответ, я проверю и вернусь. Оценил!

На мой взгляд, это не ответ Excel для вашей проблемы - во всяком случае, конечно, не в ее обычном определении.

Правильный метод для его решения - использовать язык программирования, подходящий для этой задачи; Perl, например, или даже командная оболочка, для объединения файлов. Excel нетЭто сделано для постоянного ввода / вывода файлов, но Perl неплохо справляется с большим количеством файлов. Я выполнил проект, похожий на этот (объединяя миллионы файлов) за несколько минут на относительно небольшом Unix-сервере.

Вы также можете использовать командную оболочку для совместной сортировки файлов (cat = concatenate), как предполагает nneonneo в комментариях; Я не могне сказать, что быстрее. Конечно, для написания Perl потребуется больше времени, особенно если вам нужно сначала изучить Perl (хотя примеров насеть).

Ваш ответ на вопрос