Что нового

Считывание координат из текста

MrGep

Новичок
Сообщения
74
Репутация
1
Версия AutoIt: v3.3.10.2

Описание: И снова всем доброе время суток!) Столкнулся с проблемой. Имеется текст типа

[box title=TitleBox]
3,в,520,502,0,246,0,13,Общественный+центр,471,507,99151,3331,0,14,002,503,532,1532976,1970,4
[/box]

Прошу прощения, что в таком виде.

в этом тексте последовательно идут данные
1)Номер деревни
2)Название
3)Координата X
4)Координата Y
5)id Владельца
6)Количество очков
7)id деревни


Вот мой код, где я решил использовать запятые, как разделители.
Код:
$file = FileOpen(@ScriptDir&'\village_recode.txt', 0)

If $file = -1 Then
    MsgBox(4096, "title", "warn.")
    Exit
EndIf
$i = 0;
$xkoord = " ";

While 1
    $chars = FileRead($file, 1)
    If @error = -1 Then ExitLoop

if $chars = "," Then
	  $i=$i+1
		 if $i=2 Then
			$xkoord = FileRead($file, 3)
			msgbox(0,"$xkoord",$xkoord)
		 EndIf
		 if $i=3 then
			$ykoord = FileRead($file, 3)
			msgbox(0,"$ykoord",$ykoord)
		 EndIf
		 if $i=6 Then
			$i=0
		 EndIf
	  ;msgbox(0,"tecsim",$chars)
	  EndIf
WEnd


FileClose($file)



К сожалению, в названии деревень тоже могут быть запятые, что, в принципе, портит всю картину((Нужна помощь, как выцепить координаты и количество очков. Количество очков варьируется от 15 до 14 000.

Примечания: Заранее извиняюсь, если что, просто сейчас с планшета.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
MrGep


Код:
#include <Array.au3>

$file = FileRead(@ScriptDir & '\village_recode.txt')
$aString = StringSplit($file, ','); получаем массив
_ArrayDisplay($aString)

MsgBox(0, 'Сообщение', $aString[1]) ; отображаем 1-й элемент массива
 
Автор
M

MrGep

Новичок
Сообщения
74
Репутация
1
Ага, я так понимаю, что это более изящное решение по разделителям. Проблема в том, что в названии тоже может быть запятая, и, тогда программа запишет кусок названия, как элемент массива.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Ну если в имени нет конструкций типа Имя,456 (а только - а,2а,а2) - то примерно так:

Код:
#Include <Array.au3>

;Local $aRead = StringSplit( FileRead( @ScriptDir & '\village_recode.txt' ), "," )
Local $aRead = StringSplit( "3,И4мя,Те3ст,Продолж1ение,520,502,0,246,0,13,Общественный+центр,471,507,99151,3331,0,14,002,503,532,1532976,1970,4", "," )
Local $aFixed[ UBound( $aRead ) ], $Idx, $sTmp = '', $iTmp
; ---
For $Idx = 2 To $aRead[0] Step 1
	If Not Int( $aRead[$Idx] ) = $aRead[$Idx] Then
		$sTmp &= $aRead[$Idx]
	Else
		ExitLoop
	EndIf
Next
; ---
$iTmp = $Idx - 3
Local $aFixed[ UBound( $aRead ) - $iTmp ]
	$aFixed[0] = $aRead[0] - $iTmp
	$aFixed[1] = $aRead[1]
	$aFixed[2] = $sTmp

For $Idx = 3 To $aFixed[0] Step 1
	$aFixed[$Idx] = $aRead[$Idx+$iTmp]
Next

_ArrayDisplay( $aFixed )
 
Автор
M

MrGep

Новичок
Сообщения
74
Репутация
1
Спасибо огромное за код, бездумно скопировал, попробовал, и получилось такое дело.
Вот сам файл, с которого брал текст. Villiage_recode.txt

На 87 строке код сбивается( Так как только приехал и не успел понять код firex, то сам пока поправить не могу, но постараюсь)



Код:
#Include <Array.au3>

Global $Massivcoordinat[100][3]
$kkk = 3
Local $aRead = StringSplit( FileRead( @ScriptDir & '\village_recode.txt' ), "," )
Local $aFixed[ UBound( $aRead ) ], $Idx, $sTmp = '', $iTmp

; ---
For $Idx = 2 To $aRead[0] Step 1
    If Not Int( $aRead[$Idx] ) = $aRead[$Idx] Then
        $sTmp &= $aRead[$Idx]
    Else
        ExitLoop
    EndIf
Next
; ---
$iTmp = $Idx - 3
Local $aFixed[ UBound( $aRead ) - $iTmp ]
    $aFixed[0] = $aRead[0] - $iTmp
    $aFixed[1] = $aRead[1]
    $aFixed[2] = $sTmp

For $Idx = 3 To $aFixed[0] Step 1
    $aFixed[$Idx] = $aRead[$Idx+$iTmp]
Next


for $i = 0 to 99
$Massivcoordinat[$i][0] = $aFixed[$kkk]
$Massivcoordinat[$i][1] = $aFixed[$kkk+1]
$Massivcoordinat[$i][2] = $aFixed[$kkk+3]
$kkk = $kkk + 6
Next

_ArrayDisplay($Massivcoordinat)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
MrGep,
Мои варианты.
1. Весь файл в массив.
Код:
#include <Array.au3>

Local $aTxt, $aTmp, $aRes[1], $aErr[1]

$aTxt = StringSplit(StringStripCR(StringRegExpReplace(FileRead(@ScriptDir & '\village_recode.txt'), '((^[\r\n]{0,})|([\r\n]*$))', '')), @LF)
;~ _ArrayDisplay($aTxt)
ReDim $aRes[$aTxt[0] + 1][7]
ReDim $aErr[$aTxt[0] + 1][2]
For $i = 1 To $aTxt[0]
	$aTmp = StringRegExp($aTxt[$i], '^(\d+),(.+?),(\d+),(\d+),(\d+),(\d+),(\d+)$', 3)
	If UBound($aTmp) <> 7 Then
		$aErr[0][0] += 1
		$aErr[$aErr[0][0]][0] = $i
		$aErr[$aErr[0][0]][1] = $aTxt[$i]
		ContinueLoop
	EndIf
	$aRes[0][0] += 1
	For $j = 0 To 6
		$aRes[$aRes[0][0]][$j] = $aTmp[$j]
	Next
Next
If $aErr[0][0] Then
	ReDim $aErr[$aErr[0][0] + 1][2]
	ConsoleWrite('Error [0] - номер строки; [1] - текст строки' & @LF)
	_ArrayDisplay($aErr, 'Errors')
	If $aRes[0][0] Then
		ReDim $aRes[$aRes[0][0] + 1][7]
		_ArrayDisplay($aRes, 'Result')
	EndIf
Else
	_ArrayDisplay($aRes, 'Result')
EndIf
2. Задать выводимые значения.
Код:
#include <Array.au3>

Local $aTxt, $aTmp, $aRes[1], $aErr[1], _
		$aData[5] = [4, _	;кол-во выводимых данных
		0, _				;Номер деревни
		2, _				;Координата X
		3, _				;Координата Y
		5 _					;Количество очков
		]
#cs
	Индексы:
	0	- Номер деревни
	1	- Название
	2	- Координата X
	3	- Координата Y
	4	- id Владельца
	5	- Количество очков
	6	- id деревни
#ce
$aTxt = StringSplit(StringStripCR(StringRegExpReplace(FileRead(@ScriptDir & '\village_recode.txt'), '((^[\r\n]{0,})|([\r\n]*$))', '')), @LF)
;~ _ArrayDisplay($aTxt)
ReDim $aRes[$aTxt[0] + 1][$aData[0]]
ReDim $aErr[$aTxt[0] + 1][2]
For $i = 1 To $aTxt[0]
	$aTmp = StringRegExp($aTxt[$i], '^(\d+),(.+?),(\d+),(\d+),(\d+),(\d+),(\d+)$', 3)
	If UBound($aTmp) <> 7 Then
		$aErr[0][0] += 1
		$aErr[$aErr[0][0]][0] = $i
		$aErr[$aErr[0][0]][1] = $aTxt[$i]
		ContinueLoop
	EndIf
	$aRes[0][0] += 1
	For $j = 1 To $aData[0]
		$aRes[$aRes[0][0]][$j - 1] = $aTmp[$aData[$j]]
	Next
Next
If $aErr[0][0] Then
	ReDim $aErr[$aErr[0][0] + 1][2]
	ConsoleWrite('Error [0] - номер строки; [1] - текст строки' & @LF)
	_ArrayDisplay($aErr, 'Errors')
	If $aRes[0][0] Then
		ReDim $aRes[$aRes[0][0] + 1][$aData[0]]
		_ArrayDisplay($aRes, 'Result')
	EndIf
Else
	_ArrayDisplay($aRes, 'Result')
EndIf
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
MrGep
Оу, нет, совсем не так нужно. Мой скрипт обрабатывает лишь строку. Вот вариант, который обработает все строки.

Код:
Local $sRead = StringStripCR( FileRead( @ScriptDir & '\village_recode.txt' ), "," ) )
Local $aLines = StringSplit( $sRead, @LF ) ; << Все строки с файла.

Local $aTmpLine, $aFixed, $sTmp, $iTmp
;И далее обрабатывать каждую строку отдельно:
For $LineIdx = 1 To $aLines[0] Step 1
	$sTmp = ""
	$aTmpLine = StringSplit( $aLines[$LineIdx], "," )
	If $aTmpLine[0] > 2 Then
		For $Idx = 2 To $aTmpLine[0] Step 1
			If Not Int( $aTmpLine[$Idx] ) = $aTmpLine[$Idx] Then
				$sTmp &= $aTmpLine[$Idx]
			Else
				ExitLoop
			EndIf
		Next

		$iTmp = $Idx - 3
		Dim $aFixed[ UBound( $aTmpLine ) - $iTmp ]
			$aFixed[0] = $aTmpLine[0] - $iTmp
			$aFixed[1] = $aTmpLine[1]
			$aFixed[2] = $sTmp
		For $Idx = 3 To $aFixed[0] Step 1
			$aFixed[$Idx] = $aTmpLine[$Idx+$iTmp]
		Next

		_ArrayDisplay( $aFixed, "Line: " & $LineIdx )
		;Тут я не понял, что именно вам нужно достать с полученного массива
		;Обработка текущей строки закончена, она содержится в $aFixed
	EndIf
Next
 
Автор
M

MrGep

Новичок
Сообщения
74
Репутация
1
Огромное спасибо за помощь, посмотрел варианты, узнал много нового)) ReDim для меня вообще открытие))
 
Верх