Что нового

[Данные, строки] Округление чисел в большом количестве файлов

zpo

Новичок
Сообщения
9
Репутация
0
Версия AutoIt: 3.3.8.1

Описание: Здравствуйте! Вот какая проблема: есть большое количество файлов MapifoTAB. Они содержат информацию о координатной привязке углов растра. Пример того, как выглядит этот файл, открытый Блокнотом, ниже. В 8-й, 9-й и 10-й строках находятся координаты трех углов растра. Нужно, чтобы они стали целыми: например, не 1298210.8668235, а 1298211.000, не 1298496.0222815, а 1298496.000. Буду очень признательна, если кто поможет. Заранее напишу, что в программировании полнейший 0. За счастье приму любую помощь.
Примечания:
!table
!version 300
!charset WindowsCyrillic

Definition Table
File "rastitelnost.jpg"
Type "RASTER"
(1298210.8668235,377904.64177649998) (0,0) Label "Pt 1",
(1298496.0222815,377904.64177649998) (2786,0) Label "Pt 2",
(1298210.8668235,377687.85812250001) (0,2118) Label "Pt 3"
CoordSys NonEarth Units "m"
Units "m"
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Код:
MsgBox(0,'',Round(1298210.8668235,0))

Как 2 пальца об асфальт =)
 
Автор
Z

zpo

Новичок
Сообщения
9
Репутация
0
да, но как автоматизировать процесс. нужно, чтобы в папке, где лежат эти TABы были просмотрены все файлы, найдены в строках 8-10 в первых скобках числа, которые нужно округлить, округлены и записаны уже новые TABы в другую папку.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Это уже конечно не 2 пальца но норм:
Код:
#include <Array.au3>
Global $rFile=FileRead(@ScriptDir&"\145.txt"),$aFile=StringSplit($rFile,@LF,0),$sFile
For $i=8 To 10
	$aFile[$i]="  "&__RepSreing($aFile[$i])
Next
FileWrite(@ScriptDir&"\11.txt",_ArrayToString($aFile,@LF))

Func __RepSreing($sString)
	Local $pos=StringInStr($sString,")")
	If Not @error And $pos Then
		Local $sMid=Round(StringReplace(StringReplace(StringMid($sString,1,$pos-1),")",''),"(",''),0)
		Local $sRet="("&$sMid&")"&StringMid($sString,$pos+1,-1)
		Return $sRet
	EndIf
EndFunc

Код:
#include <Array.au3>
Global $rFile=FileRead(@ScriptDir&"\145.txt"),$aFile=StringSplit($rFile,@LF,2),$sFile
For $i=7 To 9
	$aFile[$i]="  "&__RepSreing($aFile[$i])
Next
FileWrite(@ScriptDir&"\11.txt",_ArrayToString($aFile,@LF))

Func __RepSreing($sString)
	Local $pos=StringInStr($sString,")")
	If Not @error And $pos Then
		Local $sMid=StringSplit(StringReplace(StringReplace(StringMid($sString,1,$pos-1),")",''),"(",''),",",2)
		Local $sRet="("&Round($sMid[0],0)&","&Round($sMid[1],0)&")"&StringMid($sString,$pos+1,-1)
		Return $sRet
	EndIf
EndFunc


Добавлено:
Сообщение автоматически объединено:

Код:
!table
!version 300
!charset WindowsCyrillic

Definition Table
  File "rastitelnost.jpg"
  Type "RASTER"
  (1298210.8668235,377904.64177649998) (0,0) Label "Pt 1",
  (1298496.0222815,377904.64177649998) (2786,0) Label "Pt 2",
  (1298210.8668235,377687.85812250001) (0,2118) Label "Pt 3"
  CoordSys NonEarth Units "m"
  Units "m"
 

WSWR

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

Код:
#include <File.au3>

$aFileList = _FileListToArray(@ScriptDir, '*.txt', 1)


For $i = 1 To UBound($aFileList) - 1

	$sString1 = FileRead(@ScriptDir & '\' & $aFileList[$i])

	$avArray = StringRegExp($sString1, '(\d{1,15}\.\d{1,15})', 3)

	For $j = 0 To UBound($avArray) - 1
		_ReplaceStringInFile(@ScriptDir & '\' & $aFileList[$i], $avArray[$j], Round($avArray[$j]) & '.000')
	Next
Next


Обрабатывает все файлы с указанным расширением(сейчас txt) в той папке, откуда запущен скрипт.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А мне нравится метод округления к меньшему по модулю. :laugh:

Код:
#include <file.au3>

$source = FileSelectFolder("Веберите каталог где находятся исходные файлы." & @CRLF, "")
$source = $source&"\"

$dest = FileSelectFolder("Веберите каталог куда поместить обработанные файлы." & @CRLF & "Дробные числа во всех файлах будут округлены вниз." & @CRLF, "")
$dest = $dest&"\"

$search = FileFindFirstFile($source&"*.*") ; здесь можно задать шаблон поиска файлов, например "*.txt"
If $search = -1 Then Exit

While 1
	$file = FileFindNextFile($search)
	If @error Then ExitLoop
	$text = FileRead($source & $file)
	$res = StringRegExpReplace($text,"(\d+)\.(\d+)","$1")
	FileWrite($dest & $file, $res)
WEnd
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
C2H5OH сказал(а):
А мне нравится метод округления к меньшему по модулю
А можно поинтересоваться почему
OffTopic:
Что ж вас всех тянет на эти регулярные выражения=)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Можно. :smile:
Округление к меньшему по модулю (округление к нулю, целое англ. fix, truncate, integer) — самое «простое» округление, поскольку после обнуления «лишних» знаков предшествующий знак сохраняют, то есть технически оно состоит в отбрасывании лишних знаков.
;D

Что ж вас всех тянет на эти регулярные выражения=)
Я рассматриваю вопросы, возникающие на этом форуме, как задачи, решая которые я могу повысить свой скил. Поэтому задача обработки текста обычными функциями работы со строками для меня интереса не представляет.
 
Автор
Z

zpo

Новичок
Сообщения
9
Репутация
0
О, спасибо огроменное! Вы так упростили нам жизнь! Очень очень благодарна.
Пользуюсь скриптом от WSWR. Сразу все файлы в папке обрабатывает. и нули после точки в координатах приписывает.
И последний: можно выбрать папку откуда брать файлы и куда складывать. но только мне сугубо в меньшую сторону нельзя.
Всем большое спасибо!
 

WSWR

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

Версия с графическим интерфейсом и сохранением пути до папки:

Код:
#include <File.au3>
#include <GuiStatusBar.au3>

Global $sFolder = IniRead(@ScriptDir & '\Settings.ini', 'Folder', 'Path', @ScriptDir)
$hParent = GUICreate('Обработка файлов', 344, 253, -1, -1, -1)

$nButton2 = GUICtrlCreateButton('Запуск', 84, 96, 161, 89, 0)
$Input1 = GUICtrlCreateInput($sFolder, 16, 44, 261, 24)
$Label1 = GUICtrlCreateLabel('Путь до файлов', 16, 24, 151, 20)
$nButton3 = GUICtrlCreateButton('...', 276, 43, 53, 25, 0)

$hStatus = _GUICtrlStatusBar_Create($hParent)

GUISetState(@SW_SHOW, $hParent)
WinSetOnTop($hParent, '', 1)


While 1

	Switch GUIGetMsg()
		Case -3
			$sFolder = GUICtrlRead($Input1)
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path', $sFolder)
			Exit
		Case $nButton3

			WinSetOnTop($hParent, '', 0)
			$sFolder = FileSelectFolder('Исходные файлы', '')
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path', $sFolder)
			If Not @error Then GUICtrlSetData($Input1, $sFolder)
			WinSetOnTop($hParent, '', 1)

		Case $nButton2
			_GUICtrlStatusBar_SetText($hStatus, 'Обработка файлов ...')

			$aFileList = _FileListToArray($sFolder, '*.txt', 1) ; здесь менять расширение файлов
			For $i = 1 To UBound($aFileList) - 1
				$sString1 = FileRead($sFolder & '\' & $aFileList[$i])
				$avArray = StringRegExp($sString1, '(\d+\.\d+)', 3)
				For $j = 0 To UBound($avArray) - 1
					_ReplaceStringInFile($sFolder & '\' & $aFileList[$i], $avArray[$j], Round($avArray[$j]) & '.000')
				Next
			Next

			MsgBox(262144 + 48, 'Сообщение', 'Обработка файлов завершена!')
			_GUICtrlStatusBar_SetText($hStatus, '')

	EndSwitch

WEnd
 
Автор
Z

zpo

Новичок
Сообщения
9
Репутация
0
Товарищи! Огромная просьба. Для того же набора файлов возможно ли совершить новую операцию: заменить во втором столбце все, что стоит на месте 2786 и 2118 на 8333? Не в том смысле, что вместо именно этих цифр. На этом месте любая цифра может быть, НО должно быть и там, и там 8333. Прошу извинить за путанное объяснение. Эта операция отдельная от округления.
Т.е. было:
!table
!version 300
!charset WindowsCyrillic

Definition Table
File "rastitelnost.jpg"
Type "RASTER"
(1298210.8668235,377904.64177649998) (0,0) Label "Pt 1",
(1298496.0222815,377904.64177649998) (2786,0) Label "Pt 2",
(1298210.8668235,377687.85812250001) (0,2118) Label "Pt 3"
CoordSys NonEarth Units "m"
Units "m"
Должно быть:
!table
!version 300
!charset WindowsCyrillic

Definition Table
File "rastitelnost.jpg"
Type "RASTER"
(1298210.8668235,377904.64177649998) (0,0) Label "Pt 1",
(1298496.0222815,377904.64177649998) (8333,0) Label "Pt 2",
(1298210.8668235,377687.85812250001) (0,8333) Label "Pt 3"
CoordSys NonEarth Units "m"
Units "m"
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
zpo
Код:
If Not FileExists(@ScriptDir&"\1.txt") Then Exit
Global $rFile=FileRead(@ScriptDir&"\1.txt"),$aFile=StringSplit($rFile,@LF,2),$sFile
For $i=7 To 9
    $aFile[$i]="  "&__RepSreing($aFile[$i])
Next
FileWrite(@ScriptDir&"\11.txt",__ATS($aFile))
Func __RepSreing($sString)
    Local $pos=StringInStr($sString,")")
    If Not @error And $pos Then
        Local $sMid=StringSplit(StringReplace(StringReplace(StringMid($sString,1,$pos-1),")",''),"(",''),",",2)
		Local $tTemp=StringMid($sString,$pos+1,-1)
		If StringInStr($tTemp,"2786") Then $tTemp=StringReplace($tTemp,"2786","8333")
		If StringInStr($tTemp,"2118") Then $tTemp=StringReplace($tTemp,"2118","8333")
        Local $sRet="("&Round($sMid[0],0)&","&Round($sMid[1],0)&")"&$tTemp
        Return $sRet
    EndIf
EndFunc
Func __ATS($aArray)
	Local $sReturn
	For $i In $aArray
		$sReturn&=$i&@LF
	Next
	Return $sReturn
EndFunc
 
Автор
Z

zpo

Новичок
Сообщения
9
Репутация
0
Это для файла с именем 1.txt и замена, конкретных цифр на 8333?
Мне бы как в прошлый раз у WSWR - идеально было. Работало для всех файлов в папке. :ok:
не обязательно, что в файле будут 2786 или 2118. но места, где они сейчас (в примере) стоят, должны быть заполнены значением 8333. и округление желательно, чтобы уже не фигурировало.
 

WSWR

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

Как-то так:
Код:
#include <File.au3>
#include <GuiStatusBar.au3>


Global $sFolder = IniRead(@ScriptDir & '\Settings.ini', 'Folder', 'Path', @ScriptDir)
$hParent = GUICreate('Обработка файлов', 344, 253, -1, -1, -1)

$nButton2 = GUICtrlCreateButton('Запуск', 84, 96, 161, 89, 0)
$Input1 = GUICtrlCreateInput($sFolder, 16, 44, 261, 24)
$Label1 = GUICtrlCreateLabel('Путь до файлов', 16, 24, 151, 20)
$nButton3 = GUICtrlCreateButton('...', 276, 43, 53, 25, 0)

$hStatus = _GUICtrlStatusBar_Create($hParent)

GUISetState(@SW_SHOW, $hParent)
WinSetOnTop($hParent, '', 1)


While 1

	Switch GUIGetMsg()
		Case -3
			$sFolder = GUICtrlRead($Input1)
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path', $sFolder)
			Exit
		Case $nButton3

			WinSetOnTop($hParent, '', 0)
			$sFolder = FileSelectFolder('Исходные файлы', '')
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path', $sFolder)
			If Not @error Then GUICtrlSetData($Input1, $sFolder)
			WinSetOnTop($hParent, '', 1)

		Case $nButton2
			_GUICtrlStatusBar_SetText($hStatus, 'Обработка файлов ...')

			$aFileList = _FileListToArray($sFolder, '*.txt', 1) ; здесь менять расширение файлов|
			For $i = 1 To UBound($aFileList) - 1
				$sString1 = FileRead($sFolder & '\' & $aFileList[$i])
				$avArray = StringRegExp($sString1, '(\d+\.\d+)', 3)				

				For $j = 0 To UBound($avArray) - 1
					_ReplaceStringInFile($sFolder & '\' & $aFileList[$i], $avArray[$j], Round($avArray[$j]) & '.000')
				Next

				$avArray = StringRegExp($sString1, '(\d{2,})\) Lab|\((\d{2,}),', 3)

				For $j = 0 To UBound($avArray) - 1
					If $avArray[$j]<> '' Then _ReplaceStringInFile($sFolder & '\' & $aFileList[$i], $avArray[$j], '8333')
				Next

			Next

			MsgBox(262144 + 48, 'Сообщение', 'Обработка файлов завершена!')
			_GUICtrlStatusBar_SetText($hStatus, '')

	EndSwitch

WEnd
 
Автор
Z

zpo

Новичок
Сообщения
9
Репутация
0
Всем спасибо!
WSWR, Спасибо огромное!!! Снова выручили!!!
 
Автор
Z

zpo

Новичок
Сообщения
9
Репутация
0
Наверное, сразу к Вам WSWR обращаюсь.
Извините пожалуйста, но Вы бы не могли все для такого же типа файлов, лежащих в большом количестве в одной папке сделать одну штуку. Округлять ничего не нужно. Нужно только заменить в строке: File "rastitelnost.jpg" (там где имя файла - растра) расширение с того, которое там сейчас (в данном примере jpg) на pcx.
Если Вас не затруднит. В любом случае большое спасибо!
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
zpo
В данном случае проще.

Добавил в предыдущий пример кнопку с таким действием "Замена расширения"
Код:
#include <File.au3>
#include <GuiStatusBar.au3>


Global $sFolder = IniRead(@ScriptDir & '\Settings.ini', 'Folder', 'Path', @ScriptDir)
$hParent = GUICreate('Обработка файлов', 344, 253, -1, -1, -1)

$nButton2 = GUICtrlCreateButton('Запуск', 84, 96, 161, 45, 0)
$Input1 = GUICtrlCreateInput($sFolder, 16, 44, 261, 24)
$Label1 = GUICtrlCreateLabel('Путь до файлов', 16, 24, 151, 20)
$nButton3 = GUICtrlCreateButton('...', 276, 43, 53, 25, 0)

$nButton4 = GUICtrlCreateButton('Замена расширения', 84, 145, 161, 45, 0)

$hStatus = _GUICtrlStatusBar_Create($hParent)

GUISetState(@SW_SHOW, $hParent)
WinSetOnTop($hParent, '', 1)


While 1

	Switch GUIGetMsg()
		Case -3
			$sFolder = GUICtrlRead($Input1)
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path', $sFolder)
			Exit
		Case $nButton3

			WinSetOnTop($hParent, '', 0)
			$sFolder = FileSelectFolder('Исходные файлы', '')
			IniWrite(@ScriptDir & '\Settings.ini', 'Folder', 'Path', $sFolder)
			If Not @error Then GUICtrlSetData($Input1, $sFolder)
			WinSetOnTop($hParent, '', 1)

		Case $nButton2
			_GUICtrlStatusBar_SetText($hStatus, 'Обработка файлов ...')

			$aFileList = _FileListToArray($sFolder, '*.txt', 1) ; здесь менять расширение файлов
			For $i = 1 To UBound($aFileList) - 1
				$sString1 = FileRead($sFolder & '\' & $aFileList[$i])
				$avArray = StringRegExp($sString1, '(\d+\.\d+)', 3)

				For $j = 0 To UBound($avArray) - 1
					_ReplaceStringInFile($sFolder & '\' & $aFileList[$i], $avArray[$j], Round($avArray[$j]) & '.000')
				Next

				$avArray = StringRegExp($sString1, '(\d{2,})\) Lab|\((\d{2,}),', 3)

				For $j = 0 To UBound($avArray) - 1
					If $avArray[$j] <> '' Then _ReplaceStringInFile($sFolder & '\' & $aFileList[$i], $avArray[$j], '8333')
				Next

			Next

			MsgBox(262144 + 48, 'Сообщение', 'Обработка файлов завершена!')
			_GUICtrlStatusBar_SetText($hStatus, '')

		Case $nButton4
			_GUICtrlStatusBar_SetText($hStatus, 'Обработка файлов ...')

			$aFileList = _FileListToArray($sFolder, '*.txt', 1) ; здесь менять расширение файлов

			For $i = 1 To UBound($aFileList) - 1
				_ReplaceStringInFile($sFolder & '\' & $aFileList[$i], '.jpg', '.pcx') ; замена в тексте файла
			Next

			MsgBox(262144 + 48, 'Сообщение', 'Обработка файлов завершена!')
			_GUICtrlStatusBar_SetText($hStatus, '')
	EndSwitch

WEnd
 
Автор
Z

zpo

Новичок
Сообщения
9
Репутация
0
Спасибо в очередной раз огромное!
Здорово :ok: тут можно на выбор или только заменить расширение, или применить округление и замену координаты! очень удобно. спасибо!
 
Автор
Z

zpo

Новичок
Сообщения
9
Репутация
0
Всех с Наступающим!!! :IL_AutoIt_1:
 
Верх