Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Сформировать из 1 файла несколько файлов с разным числом строк (http://forum.oszone.net/showthread.php?t=326565)

nastasa 06-05-2017 22:21 2734676

Сформировать из 1 файла несколько файлов с разным числом строк
 
Здравствуйте! Помогите пожалуйста.
Задача:
Есть текстовый файл 1.txt из 500 строк.

Нужно сформировать из его строк 4 файла:
1. Содержащий первые 400 строк из 1.txt
2. Содержащий первые 300 строк из 1.txt
3. Содержащий первые 200 строк из 1.txt
4. Содержащий первые 100 строк из 1.txt

Можно ли сделать это в 1 батнике?

Iska 06-05-2017 23:13 2734685

Можно. Но проще будет сделать на WSH, або PoSH.

alpap 07-05-2017 03:51 2734728

nastasa,
ну 500 еще не так много, конечно, у меня уходит 8сек и я скажу вам что это очень много для подобной операции
Код:

@echo off
set /a x=1
for %%a in (400 300 200 100) do set /a "x=%%a,x+=1,n+=1"& call :# "%%n%%" "%%x%%"
exit

:#
 <"1.txt">"new_%~1.txt" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do @echo:[%%a]%%b|>nul find "%~2" && (exit /b) || (echo:%%b))
exit /b


megaloman 10-05-2017 23:04 2735746

Цитата:

Цитата alpap
ну 500 еще не так много, конечно, у меня уходит 8сек и я скажу вам что это очень много для подобной операции »

На моём десятилетнем ноуте на Ваш батник уходит 40 сек, и это напрягает.
Попробовал нарисовать гибрид батника и js-скрипта. Делается мигом.
Код:

@set @E=1; /*

@Echo Off

Set "FileIn=Z:\Soft_In\тра ля ля.TXT"
Set "NStrok=400 300 200 100"

Cscript //NoLogo /E:jscript "%~dpnx0" "%FileIn%" %NStrok%

GoTo :Eof

*/

var i;
var oArg = WScript.Arguments;

var NCount=oArg.Count();

if (NCount<2) {
        WScript.Echo("═х ттхфхэ√ эхюсїюфшь√х рЁуєьхэЄ√");
} else {
        NCount=NCount-2;
       
        var NStrok= new Array(NCount);
        var NFile0=oArg(0);

        NFile0=NFile0.replace(/\\/g,"\\\\");

        var FSO=WScript.CreateObject("Scripting.FileSystemObject");

        var PFN=FSO.GetParentFolderName(NFile0);
        if (PFN != '') PFN+='\\\\';

        var BN=FSO.GetBaseName(NFile0);       
        var EN=FSO.GetExtensionName(NFile0);       
       
        for (i=1; i<=NCount+1; i++) NStrok[i-1]=oArg(i);

        var j,ij,len;

        for (i=0; i<=NCount; i++) {
                for (j=i; j<=NCount; j++) {
                        if (NStrok[i]>NStrok[j]) {
                                ij=NStrok[i];
                                NStrok[i]=NStrok[j];
                                NStrok[j]=ij;                               
        }      }      }
       
        var F=FSO.OpenTextFile(NFile0,1,false);
        var Sall=F.ReadAll();
        var Mass=Sall.split('\r\n');
        F.Close();
       
        len = Mass.length;
        Sall='';
        j=0;
        ij=NStrok[j];

        for (i = 0; i < len; ++i) {
                if (i != 0) Sall+='\r\n';
                Sall+=Mass[i];

                if (i+1==ij) {
                        // WScript.Echo(PFN+BN+'-'+ij+'.'+EN);
                        F=FSO.OpenTextFile(PFN+BN+'-'+ij+'.'+EN,2,true);
                        F.Write(Sall);
                        F.Close();

                        j++;
                        while (j<=NCount) {
                                if (ij != NStrok[j]) break;
                                j++;
                        }
                        if (j>NCount) break;
                        ij=NStrok[j];
                }
        }                       
}

А вообще-то очень плохо, что нет стандартной утилиты для того, чтобы прочесть заданное кол-во строк в батнике :(
Гораздо интереснее написать батник из нескольких строк, чем несколько десятков в WSH-скрипте.

Iska 11-05-2017 03:30 2735780

Цитата:

Цитата alpap
у меня уходит 8сек и я скажу вам что это очень много для подобной операции »

Цитата:

Цитата megaloman
На моём десятилетнем ноуте на Ваш батник уходит 40 сек, и это напрягает. »

А так:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

echo Start: %time%

for %%i in (400 300 200 100) do (
        <"0001.txt" >"Out_%%i.txt" (
                for /l %%j in (1, 1, %%i) do (
                        set /p sVar=
                        echo !sVar!
                )
        )
)

echo Finish: %time%

endlocal
exit /b 0

?



Цитата:

Цитата megaloman
А вообще-то очень плохо, что нет стандартной утилиты для того, чтобы прочесть заданное кол-во строк в батнике »

Обходится таким вот кодом ;).

megaloman 11-05-2017 11:03 2735840

Iska, Позвольте не позволить! :) Загвоздка в том, что при наличии в исходном файле пустых строк Ваш скрипт работает криво, правда, быстро.
Вот фрагмент исходного файла и фрагмент после обработки
Код:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
22222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333333333333

444444444444444444444444444444444444444444444
55555555555555555555555555555555555555555555555555555
                     

66666666666666666666666666666666666666666666
7                                          7777777777777777777777777
88888888888888888888888888888888888888888888                        88888888
999999999999999 9999999999999 999 99 9999999999999999999 999999999999999999
000000000000000000000
1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

Код:

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
22222222222222222222222222222222222222222222222222222222222
3333333333333333333333333333333333333333333333333333333333333333333333333
3333333333333333333333333333333333333333333333333333333333333333333333333
444444444444444444444444444444444444444444444
55555555555555555555555555555555555555555555555555555
Режим вывода команд на экран (ECHO) отключен.
Режим вывода команд на экран (ECHO) отключен.
66666666666666666666666666666666666666666666
7                                          7777777777777777777777777
88888888888888888888888888888888888888888888                        88888888
999999999999999 9999999999999 999 99 9999999999999999999 999999999999999999
000000000000000000000


Iska 11-05-2017 12:15 2735856

Цитата:

Цитата megaloman
Iska, Позвольте не позволить! Загвоздка в том, что при наличии в исходном файле пустых строк Ваш скрипт работает криво »

Позволю :). Вы совершенно правы. Внесём одно изменение, и ещё одно — добавим:
Код:

@echo off
setlocal enableextensions enabledelayedexpansion

echo Start:  %time%

for %%i in (400 300 200 100) do (
        <"0001.txt" >"Out_%%i.txt" (
                for /l %%j in (1, 1, %%i) do (
                        set /p sVar=
                        echo.!sVar!
                        set sVar=
                )
        )
)

echo Finish: %time%

endlocal
exit /b 0



P.S. В любом случае останутся затыки с %, !, <, > и т.п.


Время: 00:35.

Время: 00:35.
© OSzone.net 2001-