Войти

Показать полную графическую версию : Замена строк в файле по признаку и маске


ВиталийВ
12-09-2015, 07:04
Добрый день!

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

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[задаваемая маска три]

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

Iska
12-09-2015, 08:38
Может ли быть «диапазон» такого вида:
61400013.97F
61400013.98F
61400013.99F
61400014.00F
61400014.01F
61400014.02F
?

ВиталийВ
12-09-2015, 10:00
Да, это считается диапазоном одного типа.

Переход на другой диапазон происходит при разрыве в счете больше заданной пользователем величины.

Т.е. два диапазона будут выглядеть так:

задается разрыв = 5 и

61400013.97F
61400013.98F
61400013.99F
61400014.00F
61400014.01F

61400014.06F
61400014.07F
61400014.08F

Приведен пример двух диапазонов.

Iska
12-09-2015, 11:29
Количество цифр до точки — всегда строго равно восьми символам? А после точки — строго двум и одной букве?

Foreigner
12-09-2015, 11:34
ВиталийВ, Powershell устроит?

$mask1 = '[mask1]'
$mask2 = '[mask2]'
$mask3 = '[mask3]'

get-content 'C:\file.txt' | group {$_.split('.')[0]} | foreach {

$group = $_.group
$group[0..($group.count-2)] | foreach { $mask1 + $_ }
$mask2 + $group[-1] + $mask3

} | set-content 'C:\file.txt'

ВиталийВ
12-09-2015, 11:48
Да, формат строк - неизменен.

Приведенный пример у меня не сработал, файл не изменился.

Iska
12-09-2015, 12:34
У меня сработал, кроме одного — в результирующем файле отсутствуют первоначальные значения между «[mask2]» и «[mask3]» :). Т.е, на исходном примере выходит (PowerShell 2.0):
[mask1]61400013.68F
[mask1]61400013.69F
[mask1]61400013.70F
[mask2][mask3]
[mask1]61400048.51F
[mask2][mask3]
[mask1]61400070.16F
[mask1]61400070.17F
[mask1]61400070.18F
[mask2][mask3]
[mask1]61400215.23F
[mask1]61400215.24F
[mask2][mask3]


ВиталийВ, коли у Вас так — выкладывайте Ваш файл, упаковав его в архив (прикрепив последний к сообщению, либо выложив на RGhost). И последний вопрос — к какому случаю следует относить «диапазон» из одной строки — к «маска1» или «маска2+маска3»?

Foreigner
12-09-2015, 13:06
У меня сработал, кроме одного — в результирующем файле отсутствуют первоначальные значения между «[mask2]» и «[mask3]» »

Попробовал с эмуляцией второй версии:

start-process powershell -arg "-version 2.0"

Не видит $group[-1], значит надо заменить на $group[$group.count-1]

Iska
12-09-2015, 13:24
Foreigner, с указанным изменением отработало корректно. Ждём теперь архив с файлом от автора (хотя не представляю навскидку, что там может не работать).

Georgio
12-09-2015, 14:20
Код пакетного файла:


@echo off
setlocal

set "file=C:\Test\example.txt"

set "text_1=[задаваемая маска]"
set "text_2=[задаваемая маска два]"
set "text_3=[задаваемая маска три]"

for /f %%i in ('"type "%file%"& del "%file%""') do (
set x=%%i
call set x=%%x:~1,-1%%
call set x=%%x:.=%%
set/a y+=1
for /f "tokens=1,2 delims=*" %%j in ('
"set/a x& <nul set/p=*& set/a y"
') do (
if defined z (
if %%j equ %%k (
call set "string=%text_1%%%z%%"
) else (
call set "string=%text_2%%%z%%%text_3%"
set blank=true
)
)
)
>>"%file%" (
if defined string cmd/v/c echo !string!
if defined blank echo.& set blank=
)
set/a y=x
set z=%%i
)
>>"%file%" cmd/v/c echo !text_2!%z%!text_3!

endlocal
exit/b


.

ВиталийВ
12-09-2015, 19:28
СУПЕР!!!!!!!!!
ИДЕАЛЬНО!!!!!!!!!!
(последний скрипт)
Единственный вопрос: при формировании файла, после вставки [задаваемая маска три] делается лишний перевод строки:

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

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

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

Где именно в скрипте устанавливается этот перевод строки, чтоб иметь возможность его убрать?

Georgio
12-09-2015, 20:43
после вставки [задаваемая маска три] делается лишний перевод строки »




Ну почему же "лишний"? Вы же сами писали в ТЗ:


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

[задаваемая маска]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[задаваемая маска три] »


.



Чтобы пустая строка не выводилась, нужно "закомментировать" строку " set blank=true" или (и) строку " if defined blank echo.& set blank=": rem set blank=true или (и) rem if defined blank echo.& set blank=.

ВиталийВ
13-09-2015, 07:54
Попробовал закомментировать обе строки - вышло как надо.

Спасибо огромное - выручили несказАнно!!!!!!!

Тетки на работе вздохнут немного, а то они по 2-3 тыщи файлов глазами отсматривали, сейчас это будет в автомате.




© OSzone.net 2001-2012