Страницы: 1
RSS
Запись CSV в массив. Какой разделитель строк?
 
Добрый день. Нашел в интернете решение по переносу csv в массив, но не пойму, какой разделитель строк в этом файле. В массив все заносится в 1 столбец. Код ниже, файл во вложении. Какой должен быть разделитель строк в этом csv файле?
Код
Sub mass()
fldr = "C:\"
s = "testdata-1000.csv"

b = TextFile2Array(, fldr, , s)
End sub
____________________________
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$ = "?") As Variant 'какой должен быть разделитель строк?

    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
Изменено: Hellmaster - 31.01.2020 11:54:35
 
Несложно найти оргигинал этого макроса на сайте автора (Игорь). Разделитель строк по умолчанию там менять не нужно.
Владимир
 
sokol92, добрый день. vbNewLine уже пробовал. Не переносит строки с таким разделителем. То есть, я вижу, что в массив кидается с разделителем " ", но не перемещает на новую строку
Изменено: Hellmaster - 31.01.2020 11:54:26
 
Попробуйте с vblf - сейчас не могу проверить.
Владимир
 
sokol92, все работает. Спасибо большое!
 
Наверное, надо так:
Код
Dim sC_Sep$, sR_Sep$
sC_Sep = Application.International(xlColumnSeparator)
sR_Sep = vbLf
b = TextFile2Array(, fldr, , s, sC_Sep, sR_Sep)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Успехов!
Владимир
 
Код
RowsSeparator$ = vbLf

Этот разделитель можно посмотреть например в Notepad++
Изменено: Hugo - 31.01.2020 12:08:22
Страницы: 1
Наверх