Компьютерный форум 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=301027)

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


Iska 10-06-2015 23:05 2517191

Кодировка «одного тхт файла» какая?

Попробуйте так:
Скрытый текст
Код:

@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 других строчки.

Только вот почему - то в результирующий файл, в конце добавляются лишние пустые строки, может я не до конца исправил (или вообще не правильно)?

Iska 11-06-2015 00:48 2517219

Цитата:

Цитата 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


Iska 11-06-2015 20:40 2517593

Цитата:

Цитата 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.

Iska 11-06-2015 21:56 2517627

Пример он и есть пример — не более, а поскольку выше было явно сказано:
Цитата:

Цитата 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'ом, например.

Foreigner 12-06-2015 10:47 2517734

Код:

gc 1.txt -readcount 4 | % { $_[0],$_[0] } | sc 2.txt

greg zakharov 13-06-2015 12:48 2518142

Foreigner, браво!


Время: 13:33.

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