Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Сортировка двумерного массива после загрузки .csv файла - Страница 4 - Мир MS Excel

Старая форма входа
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сортировка двумерного массива после загрузки .csv файла (Макросы/Sub)
Сортировка двумерного массива после загрузки .csv файла
AndreTM Дата: Суббота, 01.11.2014, 20:03 | Сообщение № 61
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
А какие ещё бывают символы переноса и подходящие к ним константы 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...


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Воскресенье, 02.11.2014, 13:25
 
Ответить
Сообщение
А какие ещё бывают символы переноса и подходящие к ним константы 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
Дата добавления - 01.11.2014 в 20:03
Vostok Дата: Воскресенье, 02.11.2014, 08:13 | Сообщение № 62
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
А в них действие "Переход к началу новой строки" строилось ....

Данное замечание Очень СУЩЕСТВЕННО в данной теме. Ведь главным звеном всего рассмотренного процесса является - чтение .CSV. Несведующий непременно об этот камешек споткнётся. respect


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
 
Ответить
Сообщение
А в них действие "Переход к началу новой строки" строилось ....

Данное замечание Очень СУЩЕСТВЕННО в данной теме. Ведь главным звеном всего рассмотренного процесса является - чтение .CSV. Несведующий непременно об этот камешек споткнётся. respect

Автор - Vostok
Дата добавления - 02.11.2014 в 08:13
Vostok Дата: Воскресенье, 02.11.2014, 08:16 | Сообщение № 63
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
Я внес изменения в код выше.
Формат даты изначально упустил.

respect Что-то не получается никому поднять репутацию. Пишет: "... зайдите через 7 часов". Или вообще всё срывается. Поэтому пока ограничимся смайликами :-)


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
 
Ответить
Сообщение
Я внес изменения в код выше.
Формат даты изначально упустил.

respect Что-то не получается никому поднять репутацию. Пишет: "... зайдите через 7 часов". Или вообще всё срывается. Поэтому пока ограничимся смайликами :-)

Автор - Vostok
Дата добавления - 02.11.2014 в 08:16
alex77755 Дата: Воскресенье, 02.11.2014, 09:19 | Сообщение № 64
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Репутация: 64 ±
Замечаний: 0% ±

doober,
[vba]
Код
Last = Last + 1
ReDim Preserve Свеча(Last)
[/vba]
Думаю этот блок заметно затормозит работу
Не?


Могу помочь в VB6, VBA
Alex77755@mail.ru
 
Ответить
Сообщениеdoober,
[vba]
Код
Last = Last + 1
ReDim Preserve Свеча(Last)
[/vba]
Думаю этот блок заметно затормозит работу
Не?

Автор - alex77755
Дата добавления - 02.11.2014 в 09:19
Vostok Дата: Воскресенье, 02.11.2014, 11:17 | Сообщение № 65
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
doober,
Last = Last + 1
ReDim Preserve Свеча(Last)
Думаю этот блок заметно затормозит работу
Не?

Пока не знаю. Надо во всём разобраться. Я так быстро не могу. ;)


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"
 
Ответить
Сообщение
doober,
Last = Last + 1
ReDim Preserve Свеча(Last)
Думаю этот блок заметно затормозит работу
Не?

Пока не знаю. Надо во всём разобраться. Я так быстро не могу. ;)

Автор - Vostok
Дата добавления - 02.11.2014 в 11:17
doober Дата: Воскресенье, 02.11.2014, 13:36 | Сообщение № 66
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
Тормозит ,но этот тормоз не соизмерим с временем сортировки


 
Ответить
СообщениеТормозит ,но этот тормоз не соизмерим с временем сортировки

Автор - doober
Дата добавления - 02.11.2014 в 13:36
AndreTM Дата: Воскресенье, 02.11.2014, 13:40 | Сообщение № 67
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Думаю этот блок заметно затормозит работу
Нет, сильно не тормозит. Массив - динамический, так что "перевыделения" памяти на весь массив не происходит, добавляется только память для одного элемента и переписывается один указатель... Сильнее тормозил бы просто ReDim :)


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
Сообщение
Думаю этот блок заметно затормозит работу
Нет, сильно не тормозит. Массив - динамический, так что "перевыделения" памяти на весь массив не происходит, добавляется только память для одного элемента и переписывается один указатель... Сильнее тормозил бы просто ReDim :)

Автор - AndreTM
Дата добавления - 02.11.2014 в 13:40
krosav4ig Дата: Воскресенье, 02.11.2014, 21:02 | Сообщение № 68
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
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
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Воскресенье, 02.11.2014, 21:05
 
Ответить
Сообщение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
[/vba]

Автор - krosav4ig
Дата добавления - 02.11.2014 в 21:02
Vostok Дата: Понедельник, 03.11.2014, 09:06 | Сообщение № 69
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 211
Репутация: 1 ±
Замечаний: 40% ±

Excel 2010
Тормозит ,но этот тормоз не соизмерим с временем сортировки



На всё-про-всё = 1 секунда. Похоже ни о каком торможении можно речь и не вести. (Хотя конечно, файл то один в примере, для сотни будет немного другое значение. Но всё же.). Единственное, что не понял, это сам смысл Процедуры, её Оптимальность. Создание пользовательского типа, сортировка, данные выгрузились не в той последовательности (файл то как устроен? данные идут от старых к новым сверху вниз, а надо чтобы свежая дата была вверху по итогу выгрузки). Вобщем нужна доработка напильничком :) . Но в любом случае, спасибо за вариант. Альтернативное решение всегда интересно. Я его в копилочку положил (потом ещё раз проанализирую).


"Посылая кого-то в Google, Помните, завтра туда могут Послать Вас !"

Сообщение отредактировал Vostok - Понедельник, 03.11.2014, 11:20
 
Ответить
Сообщение
Тормозит ,но этот тормоз не соизмерим с временем сортировки



На всё-про-всё = 1 секунда. Похоже ни о каком торможении можно речь и не вести. (Хотя конечно, файл то один в примере, для сотни будет немного другое значение. Но всё же.). Единственное, что не понял, это сам смысл Процедуры, её Оптимальность. Создание пользовательского типа, сортировка, данные выгрузились не в той последовательности (файл то как устроен? данные идут от старых к новым сверху вниз, а надо чтобы свежая дата была вверху по итогу выгрузки). Вобщем нужна доработка напильничком :) . Но в любом случае, спасибо за вариант. Альтернативное решение всегда интересно. Я его в копилочку положил (потом ещё раз проанализирую).

Автор - Vostok
Дата добавления - 03.11.2014 в 09:06
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Сортировка двумерного массива после загрузки .csv файла (Макросы/Sub)
  • Страница 4 из 4
  • «
  • 1
  • 2
  • 3
  • 4
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!