1

Тема: AHK: Обработка текстового документа.

Здравствуйте, форумчане.
Я в АХК разбираюсь буквально неделю. Можете подсобить в одном деле, кому не трудно?
В общем, есть у меня файл cars.txt, в нём хранится инфа, типа:


Nissan
Ferrari
Lada
Nissan
Porshe
Lada
Toyota
Nissan
Toyota
Lada

Как мне сдлеать так, чтобы после обработки в текстовом файле появилось что-то типа этого:


Nissan - 3
Ferrari - 1
Lada - 2
Porshe - 1
Toyota - 2

На вашем же форуме я нашёл способ потсчёта совпадений:


a:="Nissan"
u = cars.txt
FileRead, read, %u%
StringReplace, _, read, %a%,, UseErrorLevel
MsgBox, % errorlevel

Но дальше у меня что-то дело не прёт...
Думал, удалить все совпадения, чтобы переписать в формате %a% - %errorlevel%, но функция StringReplace чёго-то не работает, или я её как-то не так пишу.
Подскажите, кому не сложно.

Заранее, спасибо!

2

Re: AHK: Обработка текстового документа.

Все возможные имена машин заранее известны? Если да - то у меня нарисовался в голове отличный костыль.

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

3 (изменено: MandarinKa02, 2017-08-06 22:46:50)

Re: AHK: Обработка текстового документа.

Посмотри здесь.


sText := "
sPath := A_ScriptDir "\cars.txt"
Loop, Read, % sPath 
    If(A_LoopReadLine = "Subaru")
		sText .= A_LoopReadLine " - 1"     "`n"

FileDelete, % sPath 
FileAppend, % sText, % sPath 
Делаю скрипты на заказ.
По вопросам сюдой: Skype: live:ddeeeennn

4

Re: AHK: Обработка текстового документа.

belyankin12
Ну их же можно взять из  файла...

MandarinKa02
Ваш скрипт же удаляет файл и делает из этого:

Nissan
Ferrari
Lada
Nissan
Porshe
Lada
Toyota
Nissan
Toyota
Lada

Это:

Lada - 1
Lada - 1
Lada - 1

5

Re: AHK: Обработка текстового документа.

Mox, ну а если это отрывок из файла? Либо файл постоянно обновляется? Сомневаюсь что скрипт разрабатывается для единоразового использования.

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

6 (изменено: stealzy, 2017-08-06 23:16:48)

Re: AHK: Обработка текстового документа.

Arr:={}
list =
(
Nissan
Ferrari
Lada
Nissan
Porshe
Lada
Toyota
Nissan
Toyota
Lada
)

Loop, parse, list, `n, `r
	If Arr.HasKey(A_LoopField)
		++Arr[A_LoopField]
	Else
		Arr[A_LoopField]:=1

For k, v in Arr
	res .= k " - " v "`n"

MsgBox % res

Как писать и читать файлы расписывать или сами в справку заглянете?

7

Re: AHK: Обработка текстового документа.

Mox пишет:

Ваш скрипт же удаляет файл и делает из этого:

Я всего лишь навёл пример для одной марки машины. Чтобы все обработать - используйте массивы. А ответ написали в посте №6.

Делаю скрипты на заказ.
По вопросам сюдой: Skype: live:ddeeeennn

8 (изменено: serzh82saratov, 2017-08-07 03:42:18)

Re: AHK: Обработка текстового документа.

Можно попробовать в один проход:


List =
(
Nissan
Ferrari
Lada
Nissan
Porshe

Lada
Toyota
Nissan
Toyota
Lada
)

Loop, Parse, % List . Arr := {}, `n, `r 
	If (A_LoopField ~= "\S+" && !Arr.HasKey(A_LoopField) && Arr[A_LoopField] := 1)
		RegExReplace(List, "m`ai)^\Q" A_LoopField "\E$", "", Count) 
		, Res .= A_LoopField " - " Count "`n"
MsgBox % Res
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

9 (изменено: Malcev, 2017-08-07 04:47:49)

Re: AHK: Обработка текстового документа.

В один проход с данным примером выполняется в 2 раза медленнее.
А с таким аж в 180 раз.

loop 20000
{
   Random, r, 0, 9999999
   list .= "`n" r
}

10

Re: AHK: Обработка текстового документа.

Значит моя идейка не костылем была(.

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

11

Re: AHK: Обработка текстового документа.

KISS.

12

Re: AHK: Обработка текстового документа.

Malcev пишет:

выполняется в 2 раза медленнее

Есть такое дело, но оно сразу было понятно.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

13

Re: AHK: Обработка текстового документа.

Спасибо большое. С этим разобрался. Подскажите, может, сразу, как удалить все пустые строки из .txt. Просто, везде пишут про какие-то конкретные строки с текстом, а мне нужно удалить те, в которых наоборот, текста нету...

14

Re: AHK: Обработка текстового документа.

List =
(
Nissan
Ferrari
Lada
Nissan
Porshe



			
Lada
Toyota
Nissan
Toyota

Lada
)
MsgBox % RegExReplace(List, "\R\s*(?=\R)")
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

15 (изменено: serzh82saratov, 2017-08-07 13:09:27)

Re: AHK: Обработка текстового документа.

Файл, в случае с RegEx, лучше читать с опцией "*t".

FileRead, read, *t %путь%

Но код из 8 поста всё равно не будет обрабатывать пустые строки.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

16

Re: AHK: Обработка текстового документа.

serzh82saratov
Всё ровно остаётся строка


 - 1

17

Re: AHK: Обработка текстового документа.

В каком случае?

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

18

Re: AHK: Обработка текстового документа.

serzh82saratov
Я извиняюсь ещё много раз, понимаю, что я что-то не так делаю, но что именно, понять не могу...
Вот так работает:


MsgBox % RegExReplace(List, "\R\s*(?=\R)")

То есть в Бокс выводиться то, что нужно. А без бокса не работает...


RegExReplace(List, "\R\s*(?=\R)")

19

Re: AHK: Обработка текстового документа.

List := RegExReplace(List, "\R\s*(?=\R)")
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).
+ Mox

20

Re: AHK: Обработка текстового документа.

serzh82saratov
Вкурил. Спасибо огромное.

21

Re: AHK: Обработка текстового документа.

Всё ровно какая-то фигня.
Содержимое .txt файла:


a
a

aa
a
aaa
aa
a

aaa

Скрипт, который я слепил:


cars = cars.txt
Arr:={}
FileRead, list, %cars%
list := RegExReplace(List, "\R\s*(?=\R)")
Loop, parse, list, `n, `r
	If Arr.HasKey(A_LoopField)
		++Arr[A_LoopField]
	Else
		Arr[A_LoopField]:=1

For k, v in Arr
	res .= k " - " v "`n"
FileDelete, %cars%
FileAppend, %res%, %cars%
msgbox, % res

Он удаляет все пустые строки в промежутках, но всё ровно в конце одна не удаляется... и он её считает. И выдаёт:


 - 1
a - 4
aa - 2
aaa - 2

Как это пофиксить?

22

Re: AHK: Обработка текстового документа.

А так?


cars = cars.txt
FileRead, list, *t %cars%

Loop, Parse, % List . Arr := {}, `n, `r 
	If (A_LoopField ~= "\S+" && !Arr.HasKey(A_LoopField) && Arr[A_LoopField] := 1)
		RegExReplace(List, "m`ai)^\Q" A_LoopField "\E$", "", Count) 
		, Res .= A_LoopField " - " Count "`n"

FileDelete, %cars%
FileAppend, %res%, %cars%
msgbox, % res
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

23

Re: AHK: Обработка текстового документа.

serzh82saratov
Так норм. Ещё раз спасибо!

24 (изменено: Vicoriyan, 2017-08-26 17:53:32)

Re: AHK: Обработка текстового документа.

serzh82saratov Могу ли я применить Ваш скрипт для определения, сколько раз встречается тот или иной пиксель в выделенной области?
Пиксели ищем с помощью этого скрипта:


SetBatchLines, -1
CoordMode, Pixel, screen
pixelArray := []
pToken := Gdip_Startup()
pBitmap := Gdip_BitmapFromScreen("100|0|10|10")
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap)
Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)
loop % width
{
   A_Index_X := A_Index-1
   loop % height
   {
      pixelArray[A_Index_X, A_Index-1] := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
   }
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)

25 (изменено: serzh82saratov, 2017-08-26 20:43:19)

Re: AHK: Обработка текстового документа.

Можете наверное, но это очень долго, я бы искал решение в вашей теме про пиксели.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).