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

zdorovaBandity 14-11-2014 18:45 2429561

Разбиение текстового файла на два.
 
Здравствуйте, помогите решить задачку.
Нужно разработать и выполнить командный файл, выполняющий разбиение текстового файла, имя которого задано первым параметром КФ, на два файла с именами 1.txt и 2.txt. Количество строк в каждом из этих файлов задано вторым и третьим параметрами КФ. Проверить наличие указанного исходного файла и вывести сообщение о его отсутствии, проверить наличие остальных параметров и их значения на допустимость.
Искренне надеюсь на вашу помощь.

Iska 14-11-2014 18:53 2429564

Цитата:

Цитата zdorovaBandity
Количество строк в каждом из этих файлов задано вторым и третьим параметрами КФ. »

А что делать, если число строк в исходном файле больше, нежели (параметр2+параметр3)?

zdorovaBandity 14-11-2014 19:01 2429569

Цитата:

Цитата Iska
А что делать, если число строк в исходном файле больше, нежели (параметр2+параметр3)? »

Я даже не знаю, мне нужно любое решение, главное что бы хоть что то было)

Iska 14-11-2014 21:49 2429617

Ну, например, так:
Скрытый текст
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=%~1
set sCount1=%~2
set sCount2=%~3

set sResultFile1=1.txt
set sResultFile2=2.txt

if defined sSourceFile (
        if defined sCount1 (
                if defined sCount2 (
                        if exist "%sSourceFile%" (
                                set /a iCount1 = %sCount1%
                               
                                if !iCount1! geq 1 (
                                        set /a iCount2 = %sCount2%
                                       
                                        if !iCount2! geq 1 (
                                                call :Head "!iCount1!"
                                                call :Tail "!iCount1!" "!iCount2!"
                                        ) else (
                                                echo Third parameter [%sCount2%] must be numerical and more than 0
                                                call :Usage
                                        )
                                ) else (
                                        echo Second parameter [%sCount1%] must be numerical and more than 0
                                        call :Usage
                                )
                        ) else (
                                echo Can't find source file [%sSourceFile%].
                                exit /b 2
                        )
                ) else (
                        call :Usage
                        exit /b 1
                )
        ) else (
                call :Usage
                exit /b 1
        )
) else (
        call :Usage
        exit /b 1
)



exit /b 1

if not defined sSourceFile (
        call :Usage
        exit /b 1
)

if defined sCount1 echo [%iCount1%]
if defined sCount2 echo [%iCount2%]

endlocal
exit /b 0

:Usage
        echo Error in parameters
        echo.
        echo Usage: %~nx0 ^<Source file^> ^<String's count for 1st result file^> ^<String's count for 2nd result file^>
        exit /b 0

:Head
        setlocal enableextensions enabledelayedexpansion
       
        set /a iHeadCount = %~1
        set /a iTotalCount = 0
       
        >"%sResultFile1%" (
                for /f "usebackq tokens=1* delims=[]" %%i in (
                        `type "%sSourceFile%" ^| find.exe /n /v ""`
                ) do (
                        set /a iTotalCount += 1
                        echo.%%j
                       
                        if !iTotalCount! geq %iHeadCount% exit /b
                )
        )
       
        endlocal
        exit /b 0

:Tail
        setlocal enableextensions enabledelayedexpansion
       
        set /a iSkipCount = %~1
        set /a iTailCount = %~2
        set /a iTotalCount = 0
       
        >"%sResultFile2%" (
                for /f "usebackq tokens=1* delims=[]" %%i in (
                        `type "%sSourceFile%" ^| more +%iSkipCount% ^|find.exe /n /v ""`
                ) do (
                        set /a iTotalCount += 1
                        echo.%%j
                       
                        if !iTotalCount! geq %iTailCount% exit /b
                )
        )
       
        endlocal
        exit /b 0


Тут, конечно, не хватает ещё кучи проверок (например, что имя исходного файла не «1.txt» и не «2.txt», и т.п.) и код, мягко говоря, не слишком оптимален, но коли Вам «любое решение, главное что бы хоть что то было» — полагаю, сойдёт.

zdorovaBandity 15-11-2014 23:38 2430102

[q=Iska]Большое спасибо)


Время: 13:01.

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