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 

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.

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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

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

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

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

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

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


 - 1

17

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

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui
+ 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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

26

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

serzh82saratov Долго в плане обработки пикселей или для поиска самого решения? А вопрос наверное нельзя дублировать в другой теме. Если уж задал тут, может кто поможет.

27

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

Мне лично непонятна задача, что имеем и что хотим получить.

28

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

Malcev есть картинка например 50х50. В этой картинке 2500 пикселей. Мне нужно, чтоб скрипт проанализировал сколько шт пикселей того или иного цвета есть на этой картинке. Результат должен выглядеть так:
0xFF0146BF - 980
0xFFDBA51E - 220
0xFF002F87 - 198
0xFF181822 - 102
0xFF8B99A6 - 98
0xFFE66B70 - 52
0xFF7D1F2D - 44
0xFF5D9CEC - 24
0xFF00469E - 11
0xFFFFFEFF - 10
0xFF145348 - 7
0xFF006756 - 1
0xFF871423 - 1
И так далее.

29

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

SetBatchLines, -1
CoordMode, Pixel, screen
pToken := Gdip_Startup()
pBitmap := Gdip_BitmapFromScreen()
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap)
Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)
Arr:={}
loop % width
{
   A_Index_X := A_Index-1
   loop % height
   {
      CurrentPixel := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
      If Arr.HasKey("" CurrentPixel)
         ++Arr["" CurrentPixel]
      Else
         Arr["" CurrentPixel]:=1
   }
}
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
For k, v in Arr
   res .= k " - " v "`n"
MsgBox % res

30 (изменено: Vicoriyan, 2017-09-18 14:23:35)

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

Malcev Куда следует поставить A_Index, что бы шла нумерация строк. На примере это выглядит так:

1. 0xFF0146BF - 980
2. 0xFFDBA51E - 220
3. 0xFF002F87 - 198
4. 0xFF181822 - 102
5. 0xFF8B99A6 - 98
6. 0xFFE66B70 - 52
7. 0xFF7D1F2D - 44
8. 0xFF5D9CEC - 24
9. 0xFF00469E - 11
10. 0xFFFFFEFF - 10
11. 0xFF145348 - 7
12. 0xFF006756 - 1
13. 0xFF871423 - 1
И так далее.

31

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

Vicoriyan пишет:

Куда следует поставить A_Index, что бы шла нумерация строк

Вероятно в начало строки, из вариаций которой склеивается итоговая строка(ваш К.О.).

32

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

stealzy Все равно не понял где.

33

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

Vicoriyan, ну а из чего по-вашему получается итоговая строка res?

34 (изменено: Vicoriyan, 2017-09-18 23:21:54)

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

Malcev Догнал.

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