PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Получить строку по тексту в ней


Получить строку по тексту в ней

Сообщений 1 страница 3 из 3

1

Начал писать прогу и появилась задача из списка путей получить путь, указав имя программы. То есть надо найти текст и от этой позиции просмотреть назад и вперёд до переноса строки. Подумал что эту задачу можно выполнить в виде отдельной функции. Из недостатков - поиск #CRLF$, хотя лучше было бы любой из этих символов. Реверсирование строки для поиска можно было бы сделать отправив строку в массив и перебирать буквы в цикле назад от большего к меньшему.

Код:
EnableExplicit
Global tmp$, tmp2$, lst$, ProgList$, ProgNameTest$, Pos, Pos2, NewPos

ProgNameTest$ = "AkelPad"
ProgNameTest$ + "."

; Читаем список программ
lst$ = GetPathPart(ProgramFilename()) + "\list.txt"
If FileSize(lst$) > 3
	ReadFile(0, lst$)
	ProgList$ = #CRLF$ + ReadString(0, #PB_UTF8 | #PB_File_IgnoreEOL) + #CRLF$
	CloseFile(0)
EndIf
; MessageRequester("1", "|" + ProgList$ + "|") ; проверка позиций, что взято имя без пробелов и переносов

Pos = FindString(ProgList$, ProgNameTest$, 0, #PB_String_NoCase) ; ищем программу в списке прог, позиция в центре строки
NewPos = Pos - #MAX_PATH ;  сдвигаем позицию до начала строки
; Length = #MAX_PATH
If NewPos < 0 ; в случае если прога в самом начале, а может проще встроить в список прог комментарий
; 	Length = - NewPos
	NewPos = 1
EndIf
Pos = FindString(ProgList$, #CRLF$, Pos, #PB_String_NoCase) ; Найти конец строки
tmp$ = Mid(ProgList$, NewPos, Pos - NewPos)
Pos2 = FindString(ReverseString(tmp$), #LFCR$) ; ищем начало строки методом реверса строки и поиска от начала к концу
tmp$ = Mid(tmp$, Len(tmp$) - Pos2 + 2)       ; получаем строку "путь" целиком
; Pos = FindString(tmp$, "|", 0, #PB_String_NoCase) ; 
; If Pos
; 	tmp2$ = Mid(tmp$, Pos + 1)
; 	tmp$ = Mid(tmp$, 0, Pos -1)
; EndIf

MessageRequester("1", "|" + tmp$ + "|")

список, файл list.txt

Код:
C:\Program Files (x86)\HxD\HxD.exe
C:\Program Files (x86)\Notepad++\Notepad++.exe
C:\Program Files (x86)\AkelPad\AkelPad.exe
C:\Program Files (x86)\ResHacker\ResHacker.exe

0

2

AZJIO написал(а):

То есть надо найти текст и от этой позиции просмотреть назад и вперёд до переноса строки. Подумал что эту задачу можно выполнить в виде отдельной функции. Из недостатков - поиск #CRLF$, хотя лучше было бы любой из этих символов. Реверсирование строки для поиска можно было бы сделать отправив строку в массив и перебирать буквы в цикле назад от большего к меньшему.

А почему нельзя сделать просто всё в одном цикле?

Код:
ProgNameTest$ = "AkelPad"
ProgNameTest$ + "."
; Читаем список программ
lst$ = GetPathPart(ProgramFilename()) + "\list.txt"
If FileSize(lst$) > 3
  ReadFile(0, lst$)
  While Eof(0) = 0
      	ProgList$ = ReadString(0, #PB_UTF8)
      	If FindString(ProgList$,ProgNameTest$)
      	  MessageRequester("1", "|" + Trim(ProgList$) + "|")
      	EndIf
	Wend
	CloseFile(0)
EndIf

0

3

ВиниПур написал(а):

А почему нельзя сделать просто всё в одном цикле?

Да работает даже быстрей. Думал может постоянное обращение к диску медленнее, но через буфер с чтением тем более открыт дескриптор файла и в памяти диска адреса хранятся, видимо всё это делает чтение без тормозов. В общем на четверть быстрее, 23 к 27 при 3-кратном тесте одинаковая кучность результатов.

Отредактировано AZJIO (12.08.2020 20:30:19)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Получить строку по тексту в ней