Что нового

Замена строк в файле по признаку и маске

ВиталийВВ

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

Описание:

Добрый день!

Есть файл с содержимым вида:

61400013.68F
61400013.69F
61400013.70F
61400013.71F
61400048.51F
61400048.52F
61400070.16F
61400070.17F
61400070.18F
61400070.19F
61400215.23F
61400215.24F
61400215.25F

Если не смотреть на точки и букву F, то видно, что это просто увеличивающиеся числа,
но они как бы разбиты на диапазоны роста

1
61400013.68F
61400013.69F
61400013.70F
61400013.71F

2
61400048.51F
61400048.52F

3
61400070.16F
61400070.17F
61400070.18F
61400070.19F

4
61400215.23F
61400215.24F
61400215.25F

В каждой строке всегда присутствует точка и буква F

Суть проблемы:

Надо в каждом диапазоне заменить все строки, КРОМЕ последней на вид:

[задаваемая маска]61400013.68F
[задаваемая маска]61400013.69F
[задаваемая маска]61400013.70F
[задаваемая маска два]61400013.71F[задаваемая маска три]

таким образом:
исходное состояние:

61400013.68F
61400013.69F
61400013.70F
61400013.71F
61400048.51F
61400048.52F
61400070.16F
61400070.17F
61400070.18F
61400070.19F
61400215.23F
61400215.24F
61400215.25F

конечное состояние:

[задаваемая маска]61400013.68F
[задаваемая маска]61400013.69F
[задаваемая маска]61400013.70F
[задаваемая маска два]61400013.71F[задаваемая маска три]

[задаваемая маска]61400048.51F
[задаваемая маска два]61400048.52F[задаваемая маска три]

[задаваемая маска]61400070.16F
[задаваемая маска]61400070.17F
[задаваемая маска]61400070.18F
[задаваемая маска два]61400070.19F[задаваемая маска три]

[задаваемая маска]61400215.23F
[задаваемая маска]61400215.24F
[задаваемая маска два]61400215.25F[задаваемая маска три]

Примечания:

если видим строки:
61400013.71F
61400013.72F
61400013.90F

разница больше единицы, но результат программы именно по ним:

mask1_61400013.71F
mask1_61400013.72F
mask2_61400013.90F_mask3

Надо же, что если разница между соседними файлами была больше заданной величины, то именно тогда б срабатывал "разрыв" и использовались бы маска 2 и маска 3

т.е. тут должно получиться:

mask1_61400013.71F
mask2_61400013.72F_mask3
mask2_61400013.90F_mask3

строки вида:

61403105.98F
61403105.99F
61403106.00F
61403106.01F

Считаются одним диапазоном (разница между соседними = 1!)

Очень прошу помощи!!!
 

madmasles

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

Local $aMask[3] = ['mask1_', 'mask2_', '_mask3'], $aTxt = StringSplit(StringStripWS(StringStripCR(FileRead(@ScriptDir & '\test.txt')), 3), @LF), _
		$aRes[$aTxt[0] + 1] = [$aTxt[0]]

For $i = 2 To $aTxt[0]
	If Int($aTxt[$i]) <> Int($aTxt[$i - 1]) Then
		$aRes[$i - 1] = $aMask[1] & $aTxt[$i - 1] & $aMask[2]
	Else
		$aRes[$i - 1] = $aMask[0] & $aTxt[$i - 1]
	EndIf
Next
If Int($aTxt[$aTxt[0]]) = Int($aTxt[$aTxt[0] - 1]) Then
	$aRes[$aTxt[0]] = $aMask[1] & $aTxt[$aTxt[0]] & $aMask[2]
Else
	$aRes[$aTxt[0]] = $aMask[0] & $aTxt[$aTxt[0]]
EndIf
_ArrayDisplay($aRes)
test.txt:
Код:
61400013.68F
61400013.69F
61400013.70F
61400013.71F
61400048.51F
61400048.52F
61400070.16F
61400070.17F
61400070.18F
61400070.19F
61400215.23F
61400215.24F
61400215.25F
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
По результатам этого у меня выводится окошко с массивом, да массив сформирован верно! Но хотелось бы чтобы он "перекочевал" именно в таком же виде в текстовый файл.это возможно?

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ВиталийВВ [?]
чтобы он "перекочевал" именно в таком же виде в текстовый файл
Код:
_FileWriteFromArray



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

Или:
Код:
;~ AutoIt Version:	3.3.8.1
Local $aMask[3] = ['mask1_', 'mask2_', '_mask3'], $aTxt = StringSplit(StringStripWS(StringStripCR(FileRead(@ScriptDir & '\test.txt')), 3), @LF), $sTxt, $hFile

For $i = 2 To $aTxt[0]
	If Int($aTxt[$i]) <> Int($aTxt[$i - 1]) Then
		$sTxt &= $aMask[1] & $aTxt[$i - 1] & $aMask[2] & @CRLF
	Else
		$sTxt &= $aMask[0] & $aTxt[$i - 1] & @CRLF
	EndIf
Next
If Int($aTxt[$aTxt[0]]) = Int($aTxt[$aTxt[0] - 1]) Then
	$sTxt &= $aMask[1] & $aTxt[$aTxt[0]] & $aMask[2]
Else
	$sTxt &= $aMask[0] & $aTxt[$aTxt[0]]
EndIf
$hFile = FileOpen(@ScriptDir & '\NewTest.txt', 2)
FileWrite($hFile, $sTxt)
FileClose($hFile)
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
Туплю :-( не могу сообразить как именно дописать/воспользоваться данной функцией.




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

Получилось хорошо, но если исходный файл вида:

61400013.68F
61400013.69F
61400013.70F
61400013.71F
61400013.72F
61400013.90F
61400070.16F
61400070.17F
61400070.18F
61400070.19F
61400215.23F
61400215.24F
61400215.25F

мы видим строки:
61400013.71F
61400013.72F
61400013.90F

разница больше единицы, но результат программы именно по ним:

mask1_61400013.71F
mask1_61400013.72F
mask2_61400013.90F_mask3

Надо же, что если разница между соседними файлами была больше заданной величины, то именно тогда б срабатывал "разрыв" и использовались бы маска 2 и маска 3

т.е. тут должно получиться:

mask1_61400013.71F
mask2_61400013.72F_mask3
mask2_61400013.90F_mask3
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ВиталийВВ [?]
Надо же, что если разница между соседними файлами(?) была больше заданной величины
Я должен был об этом догадаться?

И еще:
[info border=#0000ff float=left]С такой постановкой вопроса Вам надо в Стол заказов.
Переоформите тему в соответствии с Правилами обязательного оформления тем в разделе "Стол заказов" и я ее туда перенесу.[/info]
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ВиталийВВ,
Вы русский язык понимаете? Переоформите эту тему, а не создавайте новую. :mad:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ВиталийВВ,
Добавьте в первый пост новое условие из Вашего Ответа #4.
И на будущее, если хотите получить правильный ответ, продумайте тех. задание и учтите все нюансы, а не добавляйте новые условия после получения ответа.


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

ВиталийВВ,
Так?
Код:
;~ AutoIt Version:  3.3.8.1
Local $iStep = 0.01, $aMask[3] = ['mask1_', 'mask2_', '_mask3'], $aTxt = StringSplit(StringStripWS(StringStripCR(FileRead(@ScriptDir & '\test.txt')), 3), @LF), $sTxt, $hFile

For $i = 2 To $aTxt[0]
	If Round(Number($aTxt[$i]) - Number($aTxt[$i - 1]), 2) <> $iStep Then
		$sTxt &= $aMask[1] & $aTxt[$i - 1] & $aMask[2] & @CRLF
	Else
		$sTxt &= $aMask[0] & $aTxt[$i - 1] & @CRLF
	EndIf
Next
$sTxt &= $aMask[1] & $aTxt[$aTxt[0]] & $aMask[2]
;~ ConsoleWrite($sTxt & @LF)
$hFile = FileOpen(@ScriptDir & '\NewTest.txt', 2)
FileWrite($hFile, $sTxt)
FileClose($hFile)
test.txt:
Код:
61400013.68F
61400013.69F
61400013.70F
61400013.71F
61400013.72F
61400013.90F
61400070.16F
61400070.17F
61400070.18F
61400070.19F
61400215.23F
61400215.24F
61400215.25F
 
Автор
В

ВиталийВВ

Новичок
Сообщения
177
Репутация
0
madmasles сказал(а):
ВиталийВВ,
Добавьте в первый пост новое условие из Вашего Ответа #4.
И на будущее, если хотите получить правильный ответ, продумайте тех. задание и учтите все нюансы, а не добавляйте новые условия после получения ответа.


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

ВиталийВВ,
Так?
Код:
;~ AutoIt Version:  3.3.8.1
Local $iStep = 0.01, $aMask[3] = ['mask1_', 'mask2_', '_mask3'], $aTxt = StringSplit(StringStripWS(StringStripCR(FileRead(@ScriptDir & '\test.txt')), 3), @LF), $sTxt, $hFile

For $i = 2 To $aTxt[0]
	If Round(Number($aTxt[$i]) - Number($aTxt[$i - 1]), 2) <> $iStep Then
		$sTxt &= $aMask[1] & $aTxt[$i - 1] & $aMask[2] & @CRLF
	Else
		$sTxt &= $aMask[0] & $aTxt[$i - 1] & @CRLF
	EndIf
Next
$sTxt &= $aMask[1] & $aTxt[$aTxt[0]] & $aMask[2]
;~ ConsoleWrite($sTxt & @LF)
$hFile = FileOpen(@ScriptDir & '\NewTest.txt', 2)
FileWrite($hFile, $sTxt)
FileClose($hFile)
test.txt:
Код:
61400013.68F
61400013.69F
61400013.70F
61400013.71F
61400013.72F
61400013.90F
61400070.16F
61400070.17F
61400070.18F
61400070.19F
61400215.23F
61400215.24F
61400215.25F





Идеально!!!!!!!!!!!!!!

Огромное спасибо!!!!!!!!!!
 
Верх