Alexander_88 |
10-06-2015 21:56 2517178 |
Извлечь определенные строки по счету из одного тхт файла в другой
Здравствуйте, подскажите, пожалуйста как можно из одного тхт файла скопировать 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 2517202 |
спасибо, работает. Я не много исправил, добавил еще
set sLine4=
и
>nul set /p sLine4=
т.к. нужно извлекать 1, 5, 9, 13 ......... т.е. между извлеченными строками всегда 3 других строчки.
Только вот почему - то в результирующий файл, в конце добавляются лишние пустые строки, может я не до конца исправил (или вообще не правильно)?
|
Цитата:
Цитата Alexander_88
Я не много исправил, добавил еще
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 2517220 |
работает, спасибо :)
|
greg zakharov |
11-06-2015 20:12 2517576 |
Пример однострочника (PS):
Код:
gc file|%{[Regex]$r='\d+\Z'}{if($r.Match($_).Value%4 -eq 1){"$($_)`n$_"}}
Итог:
Код:
строка1
строка1
строка5
строка5
строка9
строка9
|
Цитата:
Цитата greg zakharov
Пример однострочника (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 2517601 |
Цитата:
Цитата Iska
Навряд ли оригинальный файл имеет именно такое содержимое.
|
Дык никто на почку не закладывается: каков пример файла - таков ответ. Да и разницы нет черз for ли или foreach перебирать строки.
Цитата:
Цитата Iska
...нельзя...?
|
Это же, как Вы сами сказали, не Си и не JavaScript.
|
Пример он и есть пример — не более, а поскольку выше было явно сказано:
Цитата:
Цитата Alexander_88
скопировать 1, 5, 9, 13... и т.д. строчки (+4) »
|
— т.е., никаких ссылок на то, что будут а) числа, б) в конце строк, в) расположенные с единицы в порядке строгого возрастания — то и ориентироваться следует сугубо на порядковый номер строки.
Цитата:
Цитата greg zakharov
Это же, как Вы сами сказали, не Си и не JavaScript. »
|
Я не знаю, потому и спрашиваю. Мало ли.
|
greg zakharov |
12-06-2015 06:55 2517692 |
Цитата:
Цитата Iska
...никаких ссылок на то, что будут...
|
От перестановки мест слогаемых сумма не меняется.
Код:
1..($c=gc foo).length|%{if($_%4 -eq 1){$l=$c[$_-1];"$l`n$l"}}
Цитата:
Цитата Iska
Я не знаю, потому и спрашиваю. Мало ли.
|
Чтобы понять принцип работы for'а и парсера PS вцелом, могу лишь посоветовать поковыряться в сборках последнего ILDASM'ом, например.
|
Код:
gc 1.txt -readcount 4 | % { $_[0],$_[0] } | sc 2.txt
|
greg zakharov |
13-06-2015 12:48 2518142 |
Foreigner, браво!
|
Время: 13:33.
© OSzone.net 2001-