Сформировать из 1 файла несколько файлов с разным числом строк
Здравствуйте! Помогите пожалуйста.
Задача:
Есть текстовый файл 1.txt из 500 строк.
Нужно сформировать из его строк 4 файла:
1. Содержащий первые 400 строк из 1.txt
2. Содержащий первые 300 строк из 1.txt
3. Содержащий первые 200 строк из 1.txt
4. Содержащий первые 100 строк из 1.txt
Можно ли сделать это в 1 батнике?
|
Можно. Но проще будет сделать на WSH, або PoSH.
|
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
|
Цитата:
Цитата 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-скрипте.
|
Цитата:
Цитата 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
А вообще-то очень плохо, что нет стандартной утилиты для того, чтобы прочесть заданное кол-во строк в батнике »
|
Обходится таким вот кодом ;).
|
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
|
Цитата:
Цитата 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.
© OSzone.net 2001-