Поиск строки или числа

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Поиск строки или числа

Сообщение Fridx » 15.02.2006 (Ср) 23:31

Не подскажите, можно ли (и как) сделать такую вот штуку:
Есть папка, в ней несколько файлов с любыми именами. Прога поочерёдно ищет внутри этих файлов строку (кусок текста)?
Последний раз редактировалось Fridx 24.02.2006 (Пт) 22:28, всего редактировалось 1 раз.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 16.02.2006 (Чт) 0:05

Можно.
Код: Выделить всё
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set fldr = objfso.getFolder("c:\FolderName")
Set objFiles = fldr.files
For Each iFile in objFiles
   sName = iFile.name   
'Имя файла получили, открывай его и ищи что надо (Mid, InStr)   
...
Next
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 16.02.2006 (Чт) 1:01

О. Спасибо громадное.

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 17.02.2006 (Пт) 17:02

Я строку ищу таким путём:

...
For X = 1 To LOF(1)
Get #1, X, STROKA

If STROKA = MyText Then
Itog = Itog & " " & STROKA
End If

Next X
...

MyText - то, что ищу. Файл открыт Бинари доступом. Структура его неизвестна. Но если файл около мегабайта, то поиск ооооочень затягивается... Может есть способ какой другой?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.02.2006 (Пт) 17:45

А бинарный то доступ зачем? Открывай его как текст, считывай содержимое в строковую переменную и ищи нужную строку уже в ней.
Или СТРОКА это не строка, а некая структура?
Весь мир матрица, а мы в нем потоки байтов!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 17.02.2006 (Пт) 17:53

Надо считывать весь файл одним махом в переменную String, и уже в ней искать.

Код: Выделить всё
Dim t As String, ff as integer
ff=freefile
Open "c:\1.txt" For Input As #ff
t = Input(LOF(ff), #ff)
Close #ff

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 17.02.2006 (Пт) 19:27

Хм... Это всё ясно. А вот найти типа данных Single таким образом не получается :o

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 17.02.2006 (Пт) 19:30

Повторяю, что ищем то? Вроде речь о строке шла?
Весь мир матрица, а мы в нем потоки байтов!

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 17.02.2006 (Пт) 20:17

Да. Но теперь надо искать в файле определённый Single (например 1254,4). Причём он может быть в любом месте файла.

можно так конечно, как писал:

For X = 1 To LOF(1)
Get #1, X, CH_Single

If STROKA = MyText Then
Itog = Itog & " " & CH_Single
End If

Next X

но так долго очень

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 17.02.2006 (Пт) 20:51

Ничто не мешает перевести сингл в строку и искать ее.

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 18.02.2006 (Сб) 1:54

Что прямо так - CStr (string)???

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 18.02.2006 (Сб) 7:10

Вопрос номер раз: у тебя файл текстовый или двоичный?
Ну а насчет перевода Single в строку:
Код: Выделить всё

Dim sng As Single
sng = 12345.678
Dim s As String
s = CStr(sng)
's = "12345.678"
Весь мир матрица, а мы в нем потоки байтов!

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 18.02.2006 (Сб) 9:43

Fridx писал(а):Что прямо так - CStr (string)???

CStr(single)

!Viper! писал(а):Вопрос номер раз: у тебя файл текстовый или двоичный?

А файл может быть текстовым или двоичным?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 18.02.2006 (Сб) 10:39

!Viper! писал(а):"Amed
!Viper! писал(а):Вопрос номер раз: у тебя файл текстовый или двоичный?

А файл может быть текстовым или двоичным?


Сорри! Действительно глупость спросил... в 7.10 утра то... :?

Сформулируем по другому. В каком виде в файле содержатся числа? Если в виде строкового представления, то преобразовываем в строку как уже сказано и показано выше
Весь мир матрица, а мы в нем потоки байтов!

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 18.02.2006 (Сб) 17:25

В файле данные в виде НЕ " строкового представления". Т.е. каждое чмсло занимает 4 байта, т.к. Single.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 18.02.2006 (Сб) 17:30

Какой вообще формат файла?

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 18.02.2006 (Сб) 18:19

*.fef - неизвестный никому, т.к. формат "своей" пооги.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 18.02.2006 (Сб) 18:38

Но тебе он известен? Если неизвестен, то либо:
а) узнавать
б) распрощаться с надеждой найти значение

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 18.02.2006 (Сб) 20:57

да вопрос то такой:

Я ищу значение таким способом.

Код: Выделить всё
For X = 1 To LOF(1)
Get #1, X, CH_Single

If STROKA = MyText Then
Itog = Itog & " " & CH_Single
End If

Next X


Ищется оно нормально, но медленно. Можно ли как то ускорить?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.02.2006 (Сб) 21:03

Можно в 4 раза, если читать с шагом 4.
Изображение

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 18.02.2006 (Сб) 21:41

так неизвестно где именно может быть число

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 18.02.2006 (Сб) 22:46

Так какие данные в файле записаны? Только числа single? Тогда см. пост tyomitch.

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 19.02.2006 (Вс) 3:45

Так я ж ответил - тип данных Single. Положение их неизвестно. Например число может находиться и на 500-м байте от начала, и на 501-м. Так какой тут может быть шаг 4??

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 19.02.2006 (Вс) 8:19

Ну тогда как ты вообще отличишь число от других данных?
Вот к примеру как стринг - "vvs@", а как single уже 5,279257E-17 :wink:
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 24.02.2006 (Пт) 13:27

Вообще "vvs@" как single это 3.8041053...
ну это ладно. КАК же перевести в ВБ из 3.8041053 в vvs@??? Т.е. чтобы вот в одно поле я ввёл 3.8041053, а в другом появилось бы vvs@.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.02.2006 (Пт) 13:33

copymemory, strconv(vbunicode)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 24.02.2006 (Пт) 15:33

Подробнее можно... что-то я о таком не в книге своей не виднел, не слышал у кого-либо...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.02.2006 (Пт) 15:41

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.02.2006 (Пт) 15:42

Fridx писал(а):Вообще "vvs@" как single это 3.8041053...
ну это ладно. КАК же перевести в ВБ из 3.8041053 в vvs@??? Т.е. чтобы вот в одно поле я ввёл 3.8041053, а в другом появилось бы vvs@.

Код: Выделить всё
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub ОдноПоле_Change()
Dim s As Single: s = ОдноПоле
Dim t As String: t = "1234"
CopyMemory ByVal t, s, 4
ДругоеПоле = t
End Sub
Изображение

Fridx
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 18.01.2006 (Ср) 4:03

Сообщение Fridx » 24.02.2006 (Пт) 17:27

Спасибо. Тут API задействовано, а с ним только начал "знакомиться" так что вот туплю пока :)

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 56

    TopList