MyTetra Share
Делитесь знаниями!
Чтение CSV файла в двумерный массив
30.12.2017
23:18
Текстовые метки: VBA,FSO,CSV
Раздел: VBA - FSO

Чтение CSV файла в двумерный массив


Функция TextFile2Array предназначена для преобразования файла CSV в двумерный массив

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

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

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

Пример использования функции для загрузки данных из файла CSV:

Sub ЗагрузкаДанныхИзCSV()

' выбор файла по умолчанию предлагается в той же папке,

' где расположен текущий файл Excel

CSVarr = TextFile2Array(, ThisWorkbook.Path, , "*.csv")

 

' проверка результата загрузки данных (выход из макроса, если данные не загружены)

If Not IsArray(CSVarr) Then MsgBox "Файл CSV не обработан", vbCritical, "Ошибка": Exit Sub

 

' ваш код обработки двумерного массива

Debug.Print "Загружен двумерный массив размерами " & _

UBound(CSVarr, 1) & " строк на " & UBound(CSVarr, 2) & " столбцов"

End Sub

Результат в окне Immediate:

Загружен двумерный массив размерами 1244 строк на 9 столбцов

Код функции TextFile2Array:

Function TextFile2Array(Optional ByVal Title As String = "Выберите файл для обработки", _

Optional ByVal InitialPath As String = "c:\", _

Optional ByVal FilterDescription As String = "Текстовые файлы", _

Optional ByVal FilterExtention As String = "*.*", _

Optional ByVal ColumnsSeparator$ = ";", _

Optional ByVal RowsSeparator$ = vbNewLine) As Variant

' Функция запрашивает имя файла (текстового, CSV, и т.п.), и обрабатывает его содержимое

' В качестве параметров можно задать разделители строк и столбцов для разбиваемой строки

' Возвращает двумерный массив - результат преобразования текстового файла в двумерный массив


On Error Resume Next

With Application.FileDialog(msoFileDialogOpen) ' диалоговое окно выбора файла CSV

.ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath

.Filters.Clear: .Filters.Add FilterDescription, FilterExtention

If .Show <> -1 Then Exit Function

Filename$ = .SelectedItems(1)

End With

 

Set fso = CreateObject("scripting.filesystemobject") ' читаем текст из выбранного файла

Set ts = fso.OpenTextFile(Filename$, 1, True): txt$ = ts.ReadAll: ts.Close

Set ts = Nothing: Set fso = Nothing

 

txt = Trim(txt): Err.Clear ' разделяем текст на строки и столбцы

If txt Like "*" & RowsSeparator$ Then txt = Left(txt, Len(txt) - Len(RowsSeparator$))

 

tmpArr1 = Split(txt, RowsSeparator$): RowsCount = UBound(tmpArr1) + 1

ColumnsCount = UBound(Split(tmpArr1(0), ColumnsSeparator$)) + 1

 

If Err.Number > 0 Then MsgBox "Строка не может быть разбита на двумерный массив", vbCritical: End

ReDim arr(1 To RowsCount, 1 To ColumnsCount)

 

For i = LBound(tmpArr1) To UBound(tmpArr1)

tmpArr2 = Split(Trim(tmpArr1(i)), ColumnsSeparator$)

For j = 1 To UBound(tmpArr2)+1

arr(i + 1, j) = tmpArr2(j - 1)

Next j

Next i

TextFile2Array = arr ' возвращаем результат в виде двумерного массива

End Function



Ещё одна функция, - без вывода диалогового окна выбора файла

Function LoadArrayFromTextFile(ByVal filename$, Optional ByVal FirstRow& = 1, _

Optional ByVal ColumnsSeparator$ = ";", Optional ByVal RowsSeparator$ = vbNewLine) As Variant

' Функция открывает текстовый (CSV) файл filename$,

' и загружает макссив данных, начиная со строки FirstRow&

' В качестве параметров можно задать разделители строк и столбцов для разбиваемой строки

' Возвращает двумерный массив - результат преобразования текстового файла в двумерный массив


On Error Resume Next

Set FSO = CreateObject("scripting.filesystemobject") ' читаем текст из выбранного файла

Set ts = FSO.OpenTextFile(filename$, 1, True): txt$ = ts.ReadAll: ts.Close

Set ts = Nothing: Set FSO = Nothing

 

txt = Trim(txt): Err.Clear ' разделяем текст на строки и столбцы

If txt Like "*" & RowsSeparator$ Then txt = Left(txt, Len(txt) - Len(RowsSeparator$))

 

If FirstRow& > 1 Then ' обрезаем ненужные строки

txt = Split(txt, RowsSeparator$, FirstRow&)(FirstRow& - 1)

End If

 

Err.Clear: tmpArr1 = Split(txt, RowsSeparator$): RowsCount = UBound(tmpArr1) + 1

ColumnsCount = UBound(Split(tmpArr1(0), ColumnsSeparator$)) + 1

 

If Err.Number > 0 Then MsgBox "Текст файла " & Dir(filename$, vbNormal) & _

" не может быть считан в двумерный массив", vbCritical: Exit Function

ReDim arr(1 To RowsCount, 1 To ColumnsCount)

 

For i = LBound(tmpArr1) To UBound(tmpArr1)

tmpArr2 = Split(Trim(tmpArr1(i)), ColumnsSeparator$)

For j = 1 To UBound(tmpArr2) + 1

arr(i + 1, j) = tmpArr2(j - 1)

Next j

Next i

LoadArrayFromTextFile = arr ' возвращаем результат в виде двумерного массива

End Function

  • 25034 просмотра
Так же в этом разделе:
 
MyTetra Share v.0.52
Яндекс индекс цитирования