Войти

Показать полную графическую версию : [решено] Размножить каждую строку в txt файле n количество раз


Alexander_88
06-07-2019, 23:04
Здравствуйте, подскажите как можно размножить строки в txt файле n количество раз?

к примеру:
был txt:

qqqqqqq
rrrrrrrr
222222
ggggggggg
ggggg

мы указываем в скрипте количество дубликатов "3" и должно получиться так:
qqqqqqq
qqqqqqq
qqqqqqq
rrrrrrrr
rrrrrrrr
rrrrrrrr
222222
222222
222222
ggggggggg
ggggggggg
ggggggggg
ggggg
ggggg
ggggg

Решение нужно powershell или BAT :)

Iska
06-07-2019, 23:19
Как-то так — PowerTip: Use PowerShell to Multiply Strings | Scripting (https://devblogs.microsoft.com/scripting/powertip-use-powershell-to-multiply-strings/), например:
$iCount = 3

(
Get-Content -Path 'C:\Мои проекты\0268\0001.txt' |`
ForEach-Object -Process {
($_ + "`r`n") * $iCount
}
) -join '' | Set-Content -Path 'C:\Мои проекты\0268\0002.txt'

Alexander_88
07-07-2019, 02:37
Спасибо, все дублируется как нужно :)

greg zakharov
07-07-2019, 16:24
Слишком много действий для такой простой задачи. В pwsh можно сделать все гораздо проще:
(sls "((.*))" E:\sandbox\input.txt).Matches.Groups.Value > E:\sandbox\output.txt
С помощью sed (дублирует строки прямо в оригинальном файле):
sed -i "p;p" E:\sandbox\input.txt
Решение на cmd:
@echo off
setlocal enabledelayedexpansion
set "file=E:\sandbox\input.md"
set "repeat=3"
for /f %%i in ('find /v /c "" ^< %file%') do set "lines=%%i"
3<%file% (
for /l %%i in (1,1,!lines!) do (
set /p s=<&3
for /l %%j in (1,1,!repeat!) do echo:!s!
)
) >> E:\sandbox\output.txt
endlocal
exit /b

Iska
07-07-2019, 16:50
В pwsh можно сделать все гораздо проще: »
А где здесь указывается количество?

P.S. Насчёт «проще» оставлю на Вашей совести :lol:.

megaloman
07-07-2019, 16:58
CMD (дублирует строки прямо в оригинальном файле):@Echo Off
cls
Set "FileIn=Z:\Box_In\txt.txt"
Set /A N=5

Set /A Rep=10000000
FOR /F "usebackq delims=" %%s IN ("%FileIn%") DO Set /A Rep+=1 &Call Set "@@%%Rep%%=%%s"
>"%FileIn%" (FOR /F "usebackq tokens=1* delims==" %%a IN (`2^>nul Set "@@"`) DO (
FOR /L %%i IN (1,1,%N%) DO (Echo %%b)
))
Pause
Exit /B

greg zakharov
07-07-2019, 18:25
Iska, подобного рода заявлениями вы лишь указываете на свое незнание регэкспов.

Iska
07-07-2019, 19:03
Коллега, подобного рода заявлениями вместо вменяемого ответа, Вы демонстрируете лишь свою спесь.

greg zakharov
07-07-2019, 21:11
Iska, по себе ли кафтан примеряете? Завидуйте молча.

YuS_2
07-07-2019, 21:24
Iska, greg zakharov, не ссорьтесь, ну нет причины же для этого... на ровном месте, можно сказать...

greg zakharov, ну, правда, не сложно ведь объяснить. Всего и вся на свете знать невозможно...
А на счет проще, тоже соглашусь, не совсем это просто. Для того, чтобы это показалось простым, необходимо слишком глубоко изучить ПО, вплоть до внутреннего устройства. Не всем необходимы настолько подробные знания, иногда они излишни, имхо.

А где здесь указывается количество? »
там просто используются возможности групп шаблона регвыра, от количества скобок будет зависеть количество повторов.

Iska
07-07-2019, 21:59
YuS_2, спасибо, ясно.

Alexander_88
10-07-2019, 01:54
Спасибо всем за ответы, теперь куча вариантов :)

А как можно взять текст прямо из скрипта? (не из txt файла, а текст в самом скрипте), текст будет как и в txt файле.. несколько строк, каждую нужно размножить, количество размножений нужно также указать в скрипте.

пример:

n=3
кодкодкодкодкодкодкодкод
кодкодкодкодкодкод
кодкодкодкодкодкодкодкод
кодкодкодкодДальше строки для размножения

qwerty
111
2222

output > result.txt

результат:

result.txt
qwerty
qwerty
qwerty
111
111
111
2222
2222
2222

Iska
10-07-2019, 05:41
Например, так:
$iCount = 3

$sContent = @"
qwerty
111
2222
"@


(
$sContent -split "`r`n" |`
ForEach-Object -Process {
($_ + "`r`n") * $iCount
}
) -join '' | Set-Content -Path 'C:\Мои проекты\0268\0002.txt'

megaloman
10-07-2019, 06:45
@Echo Off
cls
Call :Mult "%~dpnx0" "Out1=====" 5 "Z:\Box_Out\OutFile1.txt"
Call :Mult "%~dpnx0" "Out2=====" 8 "Z:\Box_Out\OutFile2.txt"
Pause
Exit /B

:Mult
FOR /F "usebackq tokens=1* delims=:" %%a IN (`2^>nul FINDSTR /I /L /B /N %2 %1`) DO (
>%4 (FOR /F "usebackq delims=" %%s IN (`2^>nul More +%%a %1`) DO (
Echo %%s|>nul 2>nul FINDSTR /I /L /B %2&&Exit /B
FOR /L %%i IN (1,1,%3) DO (Echo %%s)
))
)
Exit /B

Out1=====

У попа была собака.
Поп её любил.
Она съела кусок мяса -
Поп её убил.

Out1=====

Out2=====

Ехала деревня
Мимо мужика.
Вдруг из-под собаки
Лают ворота.

Out2=====

Alexander_88
10-07-2019, 10:17
Спасибо всем за ответы, куча вариантов на разных языках :)

YuS_2
10-07-2019, 13:45
-join '' »
кстати, существует более понятный вариант (без -join '' и без "`r`n"), с точки зрения синтаксиса:
'строка1','строка2','строка3'|%{[array]$_*3}

Alexander_88
10-07-2019, 19:09
кстати, существует более понятный вариант (без -join '' и без "`r`n"), с точки зрения синтаксиса: »

спасибо, самый сокращенный вариант, скрипт в одну строку, тоже в коллекцию сохраню, хотя строки, которые нужно размножать, у меня всегда в столбик прописаны.




© OSzone.net 2001-2012