Показать полную графическую версию : [решено] Извлечь определенные строки по счету из одного тхт файла в другой
Alexander_88
10-06-2015, 21:56
Здравствуйте, подскажите, пожалуйста как можно из одного тхт файла скопировать 1, 5, 9, 13... и т.д. строчки (+4), из одного тхт файла в другой? Притом по 2 копии каждой строчки.
пример тхт файла:
строка1
строка2
строка3
строка4
строка5
строка6
строка7
строка8
строка9
строка10
строка11
выводимый тхт файл после применения скрипта:
строка1
строка1
строка5
строка5
строка9
строка9
Кодировка «одного тхт файла» какая?
Попробуйте так:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=%~1
set sDestFile=Result.txt
if defined sSourceFile (
if exist "%sSourceFile%" (
for /f "usebackq delims=" %%i in (
`type "%sSourceFile%" ^| find.exe /c /v ""`
) do set /a iLinesCount = %%~i
set /a iCycles = !iLinesCount! / 3
set /a iMod = !iLinesCount! %% 3
if !iMod! neq 0 set /a iCycles += 1
<"%sSourceFile%" >"%sDestFile%" (
for /l %%i in (1, 1, !iCycles!) do (
set sLine1=
set sLine2=
set sLine3=
>nul set /p sLine1=
>nul set /p sLine2=
>nul set /p sLine3=
echo.!sLine1!
echo.!sLine1!
)
)
) else (
echo Can't find source file [%sSourceFile%].
exit /b 2
)
) else (
echo Usage: %~nx0 ^<Source file^>
exit /b 1
)
endlocal
exit /b 0
Исходный файл указывается параметром пакетного файла (также можно перетащить исходный файл на пакетный файл в Проводнике). Имя результирующего файла тупо указано в коде («Result.txt»).
Alexander_88
10-06-2015, 23:32
спасибо, работает. Я не много исправил, добавил еще
set sLine4=
и
>nul set /p sLine4=
т.к. нужно извлекать 1, 5, 9, 13 ......... т.е. между извлеченными строками всегда 3 других строчки.
Только вот почему - то в результирующий файл, в конце добавляются лишние пустые строки, может я не до конца исправил (или вообще не правильно)?
Я не много исправил, добавил еще
set sLine4=
и
>nul set /p sLine4=
т.к. нужно извлекать 1, 5, 9, 13 ......... т.е. между извлеченными строками всегда 3 других строчки. »
Мда, это у меня уже маразм, не иначе. Попробуйте так:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=%~1
set sDestFile=Result.txt
if defined sSourceFile (
if exist "%sSourceFile%" (
for /f "usebackq delims=" %%i in (
`type "%sSourceFile%" ^| find.exe /c /v ""`
) do set /a iLinesCount = %%~i
set /a iCycles = !iLinesCount! / 4
set /a iMod = !iLinesCount! %% 4
if !iMod! neq 0 set /a iCycles += 1
<"%sSourceFile%" >"%sDestFile%" (
for /l %%i in (1, 1, !iCycles!) do (
set sLine1=
set sLine2=
set sLine3=
set sLine4=
>nul set /p sLine1=
>nul set /p sLine2=
>nul set /p sLine3=
>nul set /p sLine4=
echo.!sLine1!
echo.!sLine1!
)
)
) else (
echo Can't find source file [%sSourceFile%].
exit /b 2
)
) else (
echo Usage: %~nx0 ^<Source file^>
exit /b 1
)
endlocal
exit /b 0
Alexander_88
11-06-2015, 00:54
работает, спасибо :)
greg zakharov
11-06-2015, 20:12
Пример однострочника (PS):gc file|%{[Regex]$r='\d+\Z'}{if($r.Match($_).Value%4 -eq 1){"$($_)`n$_"}}Итог:строка1
строка1
строка5
строка5
строка9
строка9
Пример однострочника (PS): »
Навряд ли оригинальный файл имеет именно такое содержимое.
Update: На PowerShell как-то так:
$sContent = Get-Content "C:\Мои проекты\10\0001.txt"
for($i = 0; $i -le $sContent.count; $i += 4) {
$sContent[$i], $sContent[$i]
}
P.S. На PowerShell нельзя, как в C, использовать несколько операторов в строке инициализации цикла:
for($i = 0, $sContent = Get-Content "C:\Мои проекты\10\0001.txt"; $i -le $sContent.count; $i += 4) {
…?
greg zakharov
11-06-2015, 21:07
Навряд ли оригинальный файл имеет именно такое содержимое.Дык никто на почку не закладывается: каков пример файла - таков ответ. Да и разницы нет черз for ли или foreach перебирать строки....нельзя...?Это же, как Вы сами сказали, не Си и не JavaScript.
Пример он и есть пример — не более, а поскольку выше было явно сказано:
скопировать 1, 5, 9, 13... и т.д. строчки (+4) »
— т.е., никаких ссылок на то, что будут а) числа, б) в конце строк, в) расположенные с единицы в порядке строгого возрастания — то и ориентироваться следует сугубо на порядковый номер строки.
Это же, как Вы сами сказали, не Си и не JavaScript. »
Я не знаю, потому и спрашиваю. Мало ли.
greg zakharov
12-06-2015, 06:55
...никаких ссылок на то, что будут...От перестановки мест слогаемых сумма не меняется.1..($c=gc foo).length|%{if($_%4 -eq 1){$l=$c[$_-1];"$l`n$l"}}Я не знаю, потому и спрашиваю. Мало ли.Чтобы понять принцип работы for'а и парсера PS вцелом, могу лишь посоветовать поковыряться в сборках последнего ILDASM'ом, например.
Foreigner
12-06-2015, 10:47
gc 1.txt -readcount 4 | % { $_[0],$_[0] } | sc 2.txt
greg zakharov
13-06-2015, 12:48
Foreigner, браво!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.