Как определить номер строки
|
|
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
| Наверное так!
|
|
| |
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
| Это делается проще пареной репы. 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. Ничего не понимаю - но и написанный тобой выше сценарий у меня не работает... Может быть, потестишь его с моим конкретным файлом словаря? Прикрепляю...
Да пребудет с вами ММВ!
|
|
| |
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 тысяч байт). И, соответственно, столько под переменную выделяется памяти. Кроме того ее можно и обнулить после использования:
|
|
| |
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
| Вот, на: ТВОЙ СКРИПТ В ЧИСТОМ ПРОЕКТЕ. Возможно, это как-то связано с тем, что я еще добавляю к поисковому слову пробел сзади?
Да пребудет с вами ММВ!
|
|
| |
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) --------------------------------------------- Причина произошедшего была в следующем. Пустыми оказались строки, которые до обработки выглядели так: СЛОВО-определение этого слова или так: СЛОВО- определение этого слова То есть не было пробела перед тире.
Да пребудет с вами ММВ!
|
|
| |