Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
Как определить номер строки
as-masterДата: Понедельник, 09 Июля 2007, 16:22 | Сообщение # 1
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Имеется текстовый файл, лежащий по адресу Path$.
Ну например:

АБАКУМЫЧ
АБАС
АБВЕР
АБДАСТА
АБИССИНСКИЙ НАЛОГ
и т.д.

Мы знаем, что некоторое слово имеет значение АБИССИНСКИЙ.
Вопрос: как узнать номер строки, которая начинается с этого слова?

Примечание. Данный файл также УЖЕ загружен в ЛистБокс.
Если это поможет...

Добавлено (09 Июля 2007, 12:27)
---------------------------------------------
Попробовал решить эту проблему через ЛистБокс:

Code
ListBoxGetItems("SongList","Items$,ItemsNum$,#,NumItems")
For i=1 To NumItems
t$=GetArrayItem(Items$,#,i)
If (t$=find$) Then
numitem$=GetArrayItem(ItemsNum$,#,i)
numitem=VAL(numitem$)
ListBoxSelectItem("SongList","numitem")
Break()
Return()
Else
End
Ne xt i

Но всё равно работает очень медленно, если слово находится
далеко от начала списка. И даже зависает.

Добавлено (09 Июля 2007, 15:29)
---------------------------------------------
А вот вариант без использования ЛистБокса:

Code
nol=NOL(path$)
len=LEN(find$)
For i=1 To nol
      str$=StrFromFile(path$,i,1)
      str$=StrCopy(str$,1,len)
      If (str$=find$) Then
        ListBoxSelectItem("SongList","i")
        Refresh("")
        Return()
      Else
      End
Next i

Работает немного побыстрее, но всё равно медленно, сц*ко.

Добавлено (09 Июля 2007, 16:22)
---------------------------------------------
Я объясню, для чего мне это надо.
Вот есть словарь (интерфейс приведен ниже), в ЭдитБокс ввели слово,
нажали "Найти", после чего выводится результат в окне ниже и -
ВОТ ДЛЯ ЧЕГО! - автоматически выделяется нужный пункт в списке.

А для этого надо знать номер пункта, а соответственно номер строки
текстового файла, который загружали в список.



Да пребудет с вами ММВ!
 
Alex3AДата: Вторник, 10 Июля 2007, 10:47 | Сообщение # 2
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
Наверное так!
Прикрепления: 99910227.rar (18.0 Kb)
 
as-masterДата: Вторник, 10 Июля 2007, 13:14 | Сообщение # 3
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Алекс! Я чувствую, что ты сделал то-то правильное,
но как всегда, в этом разобраться очень сложно.


Мне не нужно столько функций пока, надо всего лишь
найти номер строки, запись которой совпадает
с некоторой переменной find$

Буду тебе очень признателен, если ты сделаешь
такой пример. Без лишних кнопок.

В примере должно быть:

1. Кнопка для загрузки текстового файла в лист.
2. ЭдитБокс для ввода слова find$
3. Кнопка "Найти!"
4. Сам эдит бокс.

ВСЁ!!!

PS. Плагин внедри, пожалуйста, в сам проект.
Заранее благодарю :)

Добавлено (10 Июля 2007, 13:14)
---------------------------------------------
Да, и вот еще что.
Результатом работы кнопки Найти!" должна быть
засветка (выделение) того пункта в списке,
который содержит искомое слово.


Да пребудет с вами ММВ!
 
Alex3AДата: Вторник, 10 Июля 2007, 14:49 | Сообщение # 4
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
Quote
Мне не нужно столько функций пока, надо всего лишь
найти номер строки, запись которой совпадает
с некоторой переменной find$

Не нужно, не используй!
Кнопка find вот то что ты хотел.
Берет строку из поля ввода, что внизу, находит ее в списке, выводит ее номер, и позиционирует список на найденныую
запись, чего тут непонятно?
getselnom показывает номер выделенной строки, как после выделения мышкой, так и после поиска.
loadfile загружает указанный файл - строка f$='rz.txt'
obrez+, obrez- меняет агоритм загрузки: АБАКУМЫЧ или АБАКУМЫЧ - что то там у тебя.
можешь поставить два плагина с обрезкой и без.
addlist добавляет стороку в конец переменная ff$='99999'
delsel удаляет отмеченную строку (ту что в фокусе, выбранную)
insertsel вставляет строку в выбранную позицию (ту что в фокусе, выбранную) - x$='proba'
gonum передвигает лист в указанную в поле ввода, того что внизу,
Ну, двойной щелчек, запускает скрипт плагина, который выводит текст, тот что вверху,
содержимое строки. Это так, для примера, что бы ты знал о такой возможности,
вызывать можно по любому событию, и передавать че ты хош, подумай!
Ни кто тебе не мешает выбрать в коротком плагине строку, считать позицию, и
передвинуть на нее длинный плагин.
Quote
1. Кнопка для загрузки текстового файла в лист.
2. ЭдитБокс для ввода слова find$
3. Кнопка "Найти!"
4. Сам эдит бокс.

1- кнопка load TextBTN
2 - он внизу объект EditBox переменная Stb$
3 - кнопка find TextBTN8
4 - это наверное плагин?

Quote
PS. Плагин внедри, пожалуйста, в сам проект.

Щелкни по плагину и внедри! Я использую динамическую загрузку, у меня каздый раз новая
версия плагина, иначе остается старая.
Так что спеши, давай вопросы и предложения, завтра я уезжаю, времени до вечера.
Да, свой текстовый файл я не выкладывал, там с десяток строк, можешь в первой строке скрипта кнопки
load вставить диалог загрузки файла.
Прверь на скорость.
 
RushДата: Вторник, 10 Июля 2007, 15:03 | Сообщение # 5
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Это делается проще пареной репы. smile
Code
crlf$=CHR(13)+CHR(10)
txtfind$='АБИССИНСКИЙ'
txt$=StrFromFile(filename$,1,-1)
len=LEN(txt$)
pos=POS(txtfind$, txt$)
txt$=StrDel(txt$, pos, len)
numline=GetArrayNum(txt$,crlf$)+1

Все определяется моментально...
 
Alex3AДата: Вторник, 10 Июля 2007, 16:09 | Сообщение # 6
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
Quote
Это делается проще пареной репы

В принципе да!
Да вот репа размером с небоскреб!
 
RushДата: Вторник, 10 Июля 2007, 16:14 | Сообщение # 7
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Quote (Alex3A)
Да вот репа размером с небоскреб!

Какой небоскреб, дорогой?
 
as-masterДата: Вторник, 10 Июля 2007, 16:26 | Сообщение # 8
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Quote (Rush)
Это делается проще пареной репы

Я уже пробовал похожий сценарий, но он работал неправильно,
вообще как-то непонятно - то выдавал всегда номер 1, то
еще что... Вот как было у меня:

Code
LoadText("tmp$","path$")
crlf$=CHR(13)+CHR(10)
tmp$=crlf$+tmp$+crlf$
separator$=crlf$+find$
pos=GetArrayNum(tmp$,separator$)
Message("" ,"pos")

Да, я использовал принцип, предложенный ранее тобой (Rush)
для сценария быстрого поиска моей проги Know Extension.

Ничего не понимаю - но и написанный тобой выше сценарий у меня не работает...
Может быть, потестишь его с моим конкретным файлом словаря? Прикрепляю...

Прикрепления: 86738969.zip (107.7 Kb)


Да пребудет с вами ММВ!
 
RushДата: Вторник, 10 Июля 2007, 17:03 | Сообщение # 9
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Немного не доделано было.
Code
crlf$=CHR(13)+CHR(10)  
txtfind$=crlf$+'АБИССИНСКИЙ'  
txt$=StrFromFile(filename$,2,-1)  
len=LEN(txt$)  
pos=POS(txtfind$, txt$)+2
txt$=StrDel(txt$, pos, len)  
numline=GetArrayNum(txt$,crlf$)+1

Так правильней. Но только начиная со второй строки. Ну уж первую строку отдельно определить нет проблем.
Кстати, ты не забыл заранее присвоить значение переменной filename$ ?

Потестировал с твоим файлом - нормально...

 
as-masterДата: Вторник, 10 Июля 2007, 17:26 | Сообщение # 10
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Пока даю отбой, ложная тревога.
Скрипт вроде работает, но иногда почему-то показывает не те числа -
то с разбегом на два пункта, то на четыре. И в чем причина, сейчас
пытаюсь разобраться.

Раз скрипт дает верные показания, то он должен их давать ВСЕГДА.
Значит, причина в чем-то другом...

Правда, есть другая проблема.
Ведь словарь состоит не только из слов, но и из предложений.
Например, мы делаем запрос на слово НАЛОГ, а в словаре есть пункт
АБИССИНСКИЙ НАЛОГ. Естественно, что скрипт сначала найдет этот пункт,
а это будет неправильно... :-(

Добавлено (10 Июля 2007, 17:24)
---------------------------------------------
Всё-таки, что-то там не то со словарями.
Если слово находится в начале словаря - определение строки идет правильно.
Но чем дальше от начала и чем ближе к концу - тем больше разбег показания
скрипта от действительности (в сторону увеличения).

Пошел я выяснять, что там в словарях может на это влиять...

Quote (as-master)
НАЛОГ, а в словаре есть пункт АБИССИНСКИЙ НАЛОГ

Теперь, с введением переменной crlf$, этот вопрос решен.
Кстати, я уже сделал это до того, как ты запостил, ибо уже
знал эту твою фирменную уловку :)


Да пребудет с вами ММВ!
 
Alex3AДата: Вторник, 10 Июля 2007, 17:34 | Сообщение # 11
Друг клуба ММВ
Группа: Проверенные
Сообщений: 2646
Репутация: 39
Награды: 11
Статус: Offline
Quote
Какой небоскреб, дорогой?

Размер файла.
 
RushДата: Вторник, 10 Июля 2007, 17:43 | Сообщение # 12
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Code
crlf$=CHR(13)+CHR(10)
find$='АБИССИНСКИЙ'
txt$=StrFromFile(filename$,1,1)
pos=POS(find$, txt$)
If (pos=1) Then
   numline=1
Else
   find$=crlf$+find$
   txt$=StrFromFile(filename$,2,-1)
   len=LEN(txt$)
   pos=POS(find$, txt$)+2
   txt$=StrDel(txt$, pos, len)
   numline=GetArrayNum(txt$,crlf$)+2
End

Вот полный скрипт определения строки.

Добавлено (10 Июля 2007, 17:43)
---------------------------------------------

Quote (Alex3A)
Размер файла.

Между прочим, текстовая переменная должна спокойно вмещать в себя без всяких проблем до, примерно, 2 миллиардов байт.
Кстати, файл из 100 000 строк длиной по 100 символов занимает меньше 10 мегабайт (10 миллионов 200 тысяч байт).
И, соответственно, столько под переменную выделяется памяти. Кроме того ее можно и обнулить после использования:
Code
txt$=''
 
as-masterДата: Вторник, 10 Июля 2007, 17:51 | Сообщение # 13
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Rush, сейчас начну тестировать твой последний вариант.
Но там точно что-то не так со словарем. Я проверил в "чистом" проекте.


Да пребудет с вами ММВ!
 
RushДата: Вторник, 10 Июля 2007, 17:55 | Сообщение # 14
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Quote (as-master)
Но чем дальше от начала и чем ближе к концу - тем больше разбег показания
скрипта от действительности (в сторону увеличения).

У меня с твоим файлом словаря, что ты выложил здесь, никаких проблем нет. ВСЕГДА номер строки определяется правильно.
 
as-masterДата: Вторник, 10 Июля 2007, 18:30 | Сообщение # 15
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Вот, на: ТВОЙ СКРИПТ В ЧИСТОМ ПРОЕКТЕ.
Возможно, это как-то связано с тем, что я еще
добавляю к поисковому слову пробел сзади?
Прикрепления: 80146704.zip (139.2 Kb)


Да пребудет с вами ММВ!
 
RushДата: Вторник, 10 Июля 2007, 19:06 | Сообщение # 16
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
Андрей, а ты знаешь, что при загрузке в листбокс пустые строки игнорируются?
У тебя во втором файле заместо слов-определяемых, оканчивающихся на восклицательный знак, пустые строки...

Добавлено (10 Июля 2007, 19:06)
---------------------------------------------
Да и вопросительный тоже... Может еще какие, все не смотрел...

 
as-masterДата: Вторник, 10 Июля 2007, 23:13 | Сообщение # 17
Разводящий
Группа: Модераторы
Сообщений: 2337
Репутация: 101
Награды: 5
Статус: Offline
Да, я уже тоже нашел. В этом и была проблема. Спасибо :)

А всё получилось потому, что второй файл я формировал
с помощью сценария, написанного в ММВ. Написал быстренько,
листы сделал, а сценарий удалил. Даже не помню, что там было
написано. А жаль :) Хотелось бы проанализировать.

Добавлено (10 Июля 2007, 23:13)
---------------------------------------------
Причина произошедшего была в следующем. Пустыми оказались строки,
которые до обработки выглядели так:

СЛОВО-определение этого слова

или так:

СЛОВО- определение этого слова

То есть не было пробела перед тире.


Да пребудет с вами ММВ!
 
  • Страница 1 из 1
  • 1
Поиск: