Войти

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


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

Iska
14-11-2014, 18:53
Количество строк в каждом из этих файлов задано вторым и третьим параметрами КФ. »
А что делать, если число строк в исходном файле больше, нежели (параметр2+параметр3)?

zdorovaBandity
14-11-2014, 19:01
А что делать, если число строк в исходном файле больше, нежели (параметр2+параметр3)? »
Я даже не знаю, мне нужно любое решение, главное что бы хоть что то было)

Iska
14-11-2014, 21:49
Ну, например, так:
@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
[q=Iska]Большое спасибо)




© OSzone.net 2001-2012