А какие ещё бывают символы переноса и подходящие к ним константы VBA. Где об этом хотя бы почитать можно?
Почитать можно много где... Но надо понимать, откуда вообще растут ноги у этой проблемы. А дело в том, что все проблемы, как обычно, из прошлых веков и железа Первоначально работа "текстовых редакторов" просто реализовывала действия пишущих машинок. Большинство принтеров (матричных, например) - тоже работали как те машинки. А в них действие "Переход к началу новой строки" выполнялось двумя движениями - возврат каретки к началу строки + поворот валика на шаг строки. И для каждого из этих "действий" задавался свой управляющий код. В таблице ASCII так и есть: CR - CarriadgeReturn = CHR(13), LF - LineFeed = CHR(10). А поскольку "текстовые" файлы передвались на принтер "как есть", одним потоком (сам текст и управление - всё одной кучкой ) - то для правильного выполнения нужного действия и должны были передваться оба кода CR+LF. Позже, по различным причинам (и экономия места в файле здесь не главное ) для новой строки в редакторах стало достаточно использовать хоть оба, так и любой из этих символов. И в результате "текст", созданный различными "редакторами" (полученный из различных источников) мог в качестве "новой строки" использовать различные коды... Ладно, отвлечемся. Если вы хотите просто решить данную проблему - то достаточно привести "текст" к единообразному виду. Т.е. привести любые варианты к одному. Например: [vba]
Код
' Читаем содержимое в строку Dim s$ s = CreateObject("Scripting.FileSystemObject").Getfile(LINK).OpenasTextStream(1).ReadAll ' Заменяем CR+LF на LF s = Replace(s, vbCrLf, vbLf) ' Заменяем CR на LF s = Replace(s, vbCr, vbLf) ' Делим строку a = Split(s, vbLf)
[/vba]
Ну и замечу, что в варианте doober'a используется "построчное" чтение стрима методом .ReadLine, который умеет понимать и CR, и LF...
А какие ещё бывают символы переноса и подходящие к ним константы VBA. Где об этом хотя бы почитать можно?
Почитать можно много где... Но надо понимать, откуда вообще растут ноги у этой проблемы. А дело в том, что все проблемы, как обычно, из прошлых веков и железа Первоначально работа "текстовых редакторов" просто реализовывала действия пишущих машинок. Большинство принтеров (матричных, например) - тоже работали как те машинки. А в них действие "Переход к началу новой строки" выполнялось двумя движениями - возврат каретки к началу строки + поворот валика на шаг строки. И для каждого из этих "действий" задавался свой управляющий код. В таблице ASCII так и есть: CR - CarriadgeReturn = CHR(13), LF - LineFeed = CHR(10). А поскольку "текстовые" файлы передвались на принтер "как есть", одним потоком (сам текст и управление - всё одной кучкой ) - то для правильного выполнения нужного действия и должны были передваться оба кода CR+LF. Позже, по различным причинам (и экономия места в файле здесь не главное ) для новой строки в редакторах стало достаточно использовать хоть оба, так и любой из этих символов. И в результате "текст", созданный различными "редакторами" (полученный из различных источников) мог в качестве "новой строки" использовать различные коды... Ладно, отвлечемся. Если вы хотите просто решить данную проблему - то достаточно привести "текст" к единообразному виду. Т.е. привести любые варианты к одному. Например: [vba]
Код
' Читаем содержимое в строку Dim s$ s = CreateObject("Scripting.FileSystemObject").Getfile(LINK).OpenasTextStream(1).ReadAll ' Заменяем CR+LF на LF s = Replace(s, vbCrLf, vbLf) ' Заменяем CR на LF s = Replace(s, vbCr, vbLf) ' Делим строку a = Split(s, vbLf)
[/vba]
Ну и замечу, что в варианте doober'a используется "построчное" чтение стрима методом .ReadLine, который умеет понимать и CR, и LF...AndreTM
Skype: andre.tm.007 Donate: Qiwi: 9517375010
Сообщение отредактировал AndreTM - Воскресенье, 02.11.2014, 13:25
А в них действие "Переход к началу новой строки" строилось ....
Данное замечание Очень СУЩЕСТВЕННО в данной теме. Ведь главным звеном всего рассмотренного процесса является - чтение .CSV. Несведующий непременно об этот камешек споткнётся.
А в них действие "Переход к началу новой строки" строилось ....
Данное замечание Очень СУЩЕСТВЕННО в данной теме. Ведь главным звеном всего рассмотренного процесса является - чтение .CSV. Несведующий непременно об этот камешек споткнётся. Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Я внес изменения в код выше. Формат даты изначально упустил.
Что-то не получается никому поднять репутацию. Пишет: "... зайдите через 7 часов". Или вообще всё срывается. Поэтому пока ограничимся смайликами :-)Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Нет, сильно не тормозит. Массив - динамический, так что "перевыделения" памяти на весь массив не происходит, добавляется только память для одного элемента и переписывается один указатель... Сильнее тормозил бы просто ReDim
Нет, сильно не тормозит. Массив - динамический, так что "перевыделения" памяти на весь массив не происходит, добавляется только память для одного элемента и переписывается один указатель... Сильнее тормозил бы просто ReDim AndreTM
Sub LoadCSV() Dim File_$, Path_$, strcon$, strSQL$, rsARR(), field_$ Dim cnn: Set cnn = CreateObject("ADODB.Connection") Dim rst: Set rst = CreateObject("ADODB.Recordset") Dim field xx: File_ = Application.GetOpenFilename("CSV data logs,*.csv", , "Выберите CSV файл", , False) If File_ = "False" Then If MsgBox("Хотите продолжить?", 32 Or 4, "Вы не выбрали файл!") = 6 Then GoTo xx Else: Exit Sub End If End If Path_ = Left(File_, InStrRev(File_, "\")) File_ = Mid(File_, InStrRev(File_, "\") + 1) strcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Path_ & ";Extended Properties=""text;HDR=Yes;FMT=Delimited"";" cnn.Open strcon strSQL = "SELECT * FROM " & File_ & ";" Set rst = cnn.Execute(strSQL) field_ = rst.fields(0).Name strSQL = "SELECT * FROM " & File_ & " where [" & field_ & "] is not null order by [" & field_ & "];" Set rst = cnn.Execute(strSQL) rsARR = rst.GetRows With [a1].Resize(UBound(Application.Index(rsARR, 1, 0)), UBound(rsARR) + 1) .Value = Application.Transpose(rsARR) End With rst.Close Set cnn = Nothing End Sub
[/vba]
Vostok, вотъ вам еще вариант [vba]
Код
Sub LoadCSV() Dim File_$, Path_$, strcon$, strSQL$, rsARR(), field_$ Dim cnn: Set cnn = CreateObject("ADODB.Connection") Dim rst: Set rst = CreateObject("ADODB.Recordset") Dim field xx: File_ = Application.GetOpenFilename("CSV data logs,*.csv", , "Выберите CSV файл", , False) If File_ = "False" Then If MsgBox("Хотите продолжить?", 32 Or 4, "Вы не выбрали файл!") = 6 Then GoTo xx Else: Exit Sub End If End If Path_ = Left(File_, InStrRev(File_, "\")) File_ = Mid(File_, InStrRev(File_, "\") + 1) strcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Path_ & ";Extended Properties=""text;HDR=Yes;FMT=Delimited"";" cnn.Open strcon strSQL = "SELECT * FROM " & File_ & ";" Set rst = cnn.Execute(strSQL) field_ = rst.fields(0).Name strSQL = "SELECT * FROM " & File_ & " where [" & field_ & "] is not null order by [" & field_ & "];" Set rst = cnn.Execute(strSQL) rsARR = rst.GetRows With [a1].Resize(UBound(Application.Index(rsARR, 1, 0)), UBound(rsARR) + 1) .Value = Application.Transpose(rsARR) End With rst.Close Set cnn = Nothing End Sub
EndTime = Time FullTime = EndTime - StartTime MsgBox "Время, затраченное на процедуру: " & FullTime, vbInformation, "Результаты подсчёта времени"
End Sub
[/vba]
На всё-про-всё = 1 секунда. Похоже ни о каком торможении можно речь и не вести. (Хотя конечно, файл то один в примере, для сотни будет немного другое значение. Но всё же.). Единственное, что не понял, это сам смысл Процедуры, её Оптимальность. Создание пользовательского типа, сортировка, данные выгрузились не в той последовательности (файл то как устроен? данные идут от старых к новым сверху вниз, а надо чтобы свежая дата была вверху по итогу выгрузки). Вобщем нужна доработка напильничком . Но в любом случае, спасибо за вариант. Альтернативное решение всегда интересно. Я его в копилочку положил (потом ещё раз проанализирую).
EndTime = Time FullTime = EndTime - StartTime MsgBox "Время, затраченное на процедуру: " & FullTime, vbInformation, "Результаты подсчёта времени"
End Sub
[/vba]
На всё-про-всё = 1 секунда. Похоже ни о каком торможении можно речь и не вести. (Хотя конечно, файл то один в примере, для сотни будет немного другое значение. Но всё же.). Единственное, что не понял, это сам смысл Процедуры, её Оптимальность. Создание пользовательского типа, сортировка, данные выгрузились не в той последовательности (файл то как устроен? данные идут от старых к новым сверху вниз, а надо чтобы свежая дата была вверху по итогу выгрузки). Вобщем нужна доработка напильничком . Но в любом случае, спасибо за вариант. Альтернативное решение всегда интересно. Я его в копилочку положил (потом ещё раз проанализирую).Vostok
"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
Сообщение отредактировал Vostok - Понедельник, 03.11.2014, 11:20