Выпуск № 916 от 20.07.2009, 22:05
Администратор рассылки: Калашников О.А., Руководитель
В рассылке: подписчиков - 362, экспертов - 91
В номере: вопросов - 2, ответов - 4
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
Вопрос № 170454: Здравствуйте Эксперты!! в текстовом файле храниться информация вот в таком виде : 000018,#04-09_000018_domashniu_OBN__015s.avi,15,Привет мой свет!,20042009 000019,#04-09_000019_Vekom_Bank_015s.avi,15,вклад весенняя капель до 1 мая,21...
Вопрос № 170459: Мелочь конечно, но споткнулся... в VBA что бы запустить свой модуль надо ввести Application.Run "имя модуля" как тоже самое сделать в Microsoft Visual Basic ...
Вопрос № 170454:
Здравствуйте Эксперты!!
в текстовом файле храниться информация вот в таком виде :
000018,#04-09_000018_domashniu_OBN__015s.avi,15,Привет мой свет!,20042009 000019,#04-09_000019_Vekom_Bank_015s.avi,15,вклад весенняя капель до 1 мая,21042009 000022,#04-09_000022_Reiting_Pro_015s.avi,15,#Reiting Pro 15c,21042009 000023,#04-09_000023_Konfiskat_010s.avi,10,Распродажа осень зима лето -10%,22042009 000024,#04-09_000024_Evropeyski Stil_Leto_015s.avi,15,#Evropeyski Stil_Leto_15c,22042009 000020,#04-09_000020_Mir_Detstva_010s.avi,10,Акция
-при покупке на 500 Хагис в подарок,21042009 000021,#04-09_000021_Region_Plus_010s.avi,10,#Region Plus_10c_3,21042009
(запятая разделитель)
Подскажите пожалуйста как отсортировать их по возрастанию или по убыванию . причём критерий сортировки может быть по любой из подстрок и количество подстрок в строках будет разным (разным, это в смысле в каждой строке будет одинаковое количество подстрок но
не 5 как в примере)
Спасибо заранее
Отправлен: 15.07.2009, 15:34
Вопрос задал: Lexap, Посетитель
Всего ответов: 2 Страница вопроса >>
Отвечает Megaloman, Практикант :
Здравствуйте, Lexap. Идея решения - переписываем исходный текстовый файл в общий массив (число элементов = числу строк), выделяем во вспомогательный массив той же длины необходимую подстроку из каждой строки, организуем индексный массив, сортируем этот массив таким образом, чтобы он содержал последовательность индексов элементов вспомогательного (а, следовательно, и общего) массива в отсортированном порядке. Записываем общий массив в текстовый файл в соответствии с порядком в индексном массиве.
Код:
' В Указанном текстовом файле отсортируем строки по указанной подстроке
InFile = "D:\Примеры макроса\Для сортировки 10000.txt" ' Путь к текстовому файлу
Set FSO = CreateObject("Scripting.FileSystem
Object")
OutOrder = 0 ' =0 Сортируем по возрастанию, не 0 - по убыванию iSort = 4 ' Сортируем по указанному номеру подстроки Delim = "," ' Символ разделителя InSave = 1 ' =0 -Не сохраним копию исходного файла, не 0 -сохраним
' Если надо сохранить исходный файл в .bak
If InSave <> 0 Then On Error Resume Next Set F1 = FSO.GetFile(InFile) If Err.Number = 0 Then F1.Copy InFile + ".bak" F1.Close End If End If
' Читаем исходный файл в массив On Error Resume Next Set F1 = FSO.OpenTextFile(InFile, 1, False)
If Err.Number = 0 Then Messa = CStr(Time) + " Сортировка начата" + Chr(13) + Chr(1
0) iString = F1.ReadAll() F1.Close iString = Replace(iString, Chr(10), "") Mass = Split(iString, Chr(13)) iString = "" N = UBound(Mass)
' Выделяем в отдельный массив подстроки, по которым сортируем, и массив индексов
ReDim MSort(N), MIndex(N) For i = 0 To N
MIndex(i) = i iMass = Split(Mass(i), Delim) M = UBound(iMass) sString = ""
If 1 <= iSort And iSort <= M + 1 Then sString = iMass(iSort - 1) MSort(i) = sString Next
' Сортируем массив подстрок в индексном массиве ' Записываем в файл исходный массив в отсортированном порядке
Set F1 = FSO.OpenTextFile(InFile, 2, True)
L = (OutOrder = 0) iString = ""
For i = 0 To N For j = i To N If L Then
' LL = (StrComp(MSort(MIndex(i)), MSort(MIndex(j))) = 1) LL = MSort(MIndex(i)) > MSort(MIndex(j)) Else ' LL = (StrComp(MSort(MIndex(i)), MSort(MIndex(j))) = -1) LL = MSort(MIndex(i)) < MSort(MIndex(j)) End If If LL Then k = MIndex(i) MIndex(i) = MIndex(j)
MIndex(j) = k End If Next If Trim(Mass(MIndex(i))) <> "" Then ' Если надо, чтобы после последней строки не было символа конца строки F1.Write (iString + Mass(MIndex(i))) iString = Chr(13) + Chr(10) End If ' If Trim(Mass(MIndex(i))) <> "" Then F1.WriteLine (Mass(MIndex(i))) ' Если надо, чтобы и после последней строки был символ конца стро
ки
Приведенный код может быть использован как в макросе Excel, так и в качестве vbs-скрипта. Следует заметить, что на моём компьютере (P4 -2.4ГГц) под Excel 10000 записей сортировались менее минуты. VBS скрипт то же проделывал минут за 5. По видимому, время будет сильно зависеть от длины подстроки, по которой сортируем.
У меня был 51 символ (при общей длине строк с разделителями 200 символов). Объем файла составил около 2 мегабайтов. Выкачать готовый скрипт можно здесь ----- Нет времени на медленные танцы
Ответ отправил: Megaloman, Практикант
Ответ отправлен: 16.07.2009, 01:49
Оценка ответа: 5
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 252209
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Отвечает HookEst, Специалист :
Здравствуйте, Lexap. Еще вариант для примера: Здесь для хранения прочитанных строк я использовал Collection, для работы с файлами использовал не FSO, а "старый" способ Open/Input/Print. Ну и сортирую я строки сразу, во время чтения: двоичным поиском нахожу место, где она должна стоять в Collection, туда и вставляю. В результате, когда файл прочитан, в Collection будут все строки этого файла, в нужном нам порядке. Осталось их только записать... PROFIT.
аргументы SortFile: srcPath
As String - путь к файлу, откуда читаем; dstPath As String - путь к файлу, куда пишем (может быть тем же, что и srcPath); Delimiter As String - разделитель значений в строке(разделитель строк такой же как для Line Input# vbCr или vbCrLf); SortValueIndex As Long - индекс значения по которому сортируем (с 0!)
Поиск и вставку вынес в Sub Insert...
Успехов.
Приложение:
Ответ отправил: HookEst, Специалист
Ответ отправлен: 17.07.2009, 02:01
Оценка ответа: 5
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 252249
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Вопрос № 170459:
Мелочь конечно, но споткнулся...
в VBA что бы запустить свой модуль надо ввести Application.Run "имя модуля"
как тоже самое сделать в Microsoft Visual Basic
Отправлен: 15.07.2009, 17:15
Вопрос задал: Lexap, Посетитель
Всего ответов: 2 Страница вопроса >>
Отвечает Витер Александр Анатольевич, 3-й класс :
Здравствуйте, Lexap. С помощью Application.Run вы запускаете не модуль на выполнение — это невозможно — а определенную процедуру. При этом, можно указывать имя модуля, в котором располагается процедура.
Чтобы иметь возможность вызвать процедуру из другого модуля, эта процедура должна быть объявлена как Public. Например, в модуле есть процедуры, объявленные таким образом: Public Sub Proc1() End Sub
Private Sub Proc2() End Sub
Sub Proc3() End Sub
Тогда из другого
модуля можно будет запустить только процедуры Proc1 (объявлена как Public) и Proc3 (не указана область действия процедуры, но Public по-умолчанию)
Чтобы запустить процедуру на выполнение, нужно просто написать ее имя. Или использовать оператор Call <имя_процедуры>
----- Лучше день потерять - потом за пять минут долететь!
Может мне и засчитают этот ответ как повторение предыдущего участника, но опишу немного подробнее.
Программа пользователя выполняет код, написанный в основной процедуре. В Basic можно использовать несколько видов внешних ( по отношению к выполняемой в данный момент процедуре ) программ - процедуры и функции. Различие небольшое, но основное в том, что функция обычно возвращает какое-либо значение, а процедуру можно использовать как самостоятельный модуль.
В связи
с ограничением размера программного кода в исходниках ( и для удобства программирования ) всю программу можно разбить по отдельным модулям ( мне уже писало, что модуль не может быть сохранен из-за слишком большого размера программного кода в нем и приходилось несколько процедур переносить в новый модуль) . В модуле формы описывается внешний вид формы, находящиеся на ней кнопки, списки, текст, поля ввода и многое другое. После выбора пользователем запускается обработчик
события, находящийся внутри этой формы. И как раз в этот момент есть возможность внутри обработчика вызывать внешние процедуры и функции.
Для примера работы с функцией, пусть будет форма Form1 , на которой расположено поле ввода Text1 , строка вывода Label1 и кнопка Command1. Обработка событий ввода значения в поле ввода и нажатия кнопки расположена в самой форме, функция находится в модуле Module1 под именем rou_nd. Если бы функция располагалась в том же модуле, в котором расположена процедура,
из которой она вызывалась, то можно было бы ее объявить как Private Function ( "личная" ) . Если же она будет в другом модуле ( как в примере ) , то должна быть объявлена Public Function ( "общая" ) . Пользователь вводит в поле число, которое нужно преобразовать в строку с округлением до двух знаков после запятой и вывести полученное значение в строку вывода. Для обработки используем пользовательскую функцию ( Пример 1) .
Это же задание
можно сделать с использованием внешней процедуры ( Пример 2 ) . Процедура сама берет введенное в поле значение, преобразует и присваивает его строке на форме.
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.