Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Замена строк в файле по признаку и маске (http://forum.oszone.net/showthread.php?t=305313)

ВиталийВ 12-09-2015 07:04 2552326

Замена строк в файле по признаку и маске
 
Добрый день!

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

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 2552337

Может ли быть «диапазон» такого вида:
Код:

61400013.97F
61400013.98F
61400013.99F
61400014.00F
61400014.01F
61400014.02F

?

ВиталийВ 12-09-2015 10:00 2552350

Да, это считается диапазоном одного типа.

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

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

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

61400013.97F
61400013.98F
61400013.99F
61400014.00F
61400014.01F

61400014.06F
61400014.07F
61400014.08F

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

Iska 12-09-2015 11:29 2552367

Количество цифр до точки — всегда строго равно восьми символам? А после точки — строго двум и одной букве?

Foreigner 12-09-2015 11:34 2552369

ВиталийВ, 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 2552371

Да, формат строк - неизменен.

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

Iska 12-09-2015 12:34 2552381

У меня сработал, кроме одного — в результирующем файле отсутствуют первоначальные значения между «[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 2552386

Цитата:

Цитата Iska
У меня сработал, кроме одного — в результирующем файле отсутствуют первоначальные значения между «[mask2]» и «[mask3]» »

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

start-process powershell -arg "-version 2.0"
Не видит $group[-1], значит надо заменить на $group[$group.count-1]

Iska 12-09-2015 13:24 2552390

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

Georgio 12-09-2015 14:20 2552397

Код пакетного файла:


Код:

@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 2552479

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

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

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

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

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

Georgio 12-09-2015 20:43 2552498

Цитата:

Цитата ВиталийВ
после вставки [задаваемая маска три] делается лишний перевод строки »




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


Цитата:

Цитата ВиталийВ
конечное состояние:

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

Попробовал закомментировать обе строки - вышло как надо.

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

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


Время: 07:13.

Время: 07:13.
© OSzone.net 2001-