Войти

Показать полную графическую версию : Сформировать из 1 файла несколько файлов с разным числом строк


nastasa
06-05-2017, 22:21
Здравствуйте! Помогите пожалуйста.
Задача:
Есть текстовый файл 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
Можно. Но проще будет сделать на WSH, або PoSH.

alpap
07-05-2017, 03:51
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
ну 500 еще не так много, конечно, у меня уходит 8сек и я скажу вам что это очень много для подобной операции »На моём десятилетнем ноуте на Ваш батник уходит 40 сек, и это напрягает. @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
у меня уходит 8сек и я скажу вам что это очень много для подобной операции »
На моём десятилетнем ноуте на Ваш батник уходит 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

?

http://i.imgur.com/DKMKQC6.png

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

megaloman
11-05-2017, 11:03
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
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

http://i.imgur.com/izCX2op.png

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




© OSzone.net 2001-2012