Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] разбить по строкам txt

Ответить
Настройки темы
CMD/BAT - [решено] разбить по строкам txt

Старожил


Сообщения: 267
Благодарности: 8

Профиль | Отправить PM | Цитировать


есть list.txt
как разбить его на list01.txt, list02.txt ... по 50 строк?

т.е. если есть list.txt в котором 400 строк - то разбить его на 8 txt-файлов по 50 строк

Отправлено: 20:40, 29-08-2010

 

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


добрый день, подскажите как исправить проблему в этом варианте
Код: Выделить весь код
@echo off
set $n=50

for /f "tokens=1* delims=[]" %%i in ('find /v /n "" ^<list.txt') do set "$j=%%j"& call :sub %%i
exit
:sub
set /a $m=(%~1-1)/%$n%+1
set $m=0%$m%
set $m=%$m:~-2%

if not "%$i%"=="%$m%" type nul >list%$m%.txt
>>list%$m%.txt echo.%$j%
set $i=%$m%& exit /b
В моем txt файле бывают строки, начинающиеся со знака [
Дак вот в выходных файлах этот знак удаляется, как избежать этого?

Отправлено: 14:32, 16-08-2014 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата AlexanderSh88:
подскажите как исправить проблему в этом варианте
В моем txt файле бывают строки, начинающиеся со знака [
Дак вот в выходных файлах этот знак удаляется, как избежать этого? »
Напрямую — никак, delims он и есть delims. Используйте другие варианты.

Отправлено: 15:34, 16-08-2014 | #12


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
@echo off

set "$file=list.txt"
set $n=50

for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%$file%"') do set $j=%%j& call :sub %%i
exit

:sub
 set /a $m=(%~1-1)/%$n%+1
 set $m=0%$m%
 for %%i in ("%$file%") do (
  if not "%$i%"=="%$m:~-2%" (
   type nul>"%%~ni%$m:~-2%%%~xi"
   )
  (
  set /p="%$j%"<nul
  echo.
  )>>"%%~ni%$m:~-2%%%~xi"
  )
  set $i=%$m:~-2%
  exit /b
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:39, 16-08-2014 | #13


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Georgio, сейчас окажется, что некоторые строки начинаются и с «:» .

Отправлено: 15:46, 16-08-2014 | #14


Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


спасибо, работает!

Последний раз редактировалось AlexanderSh88, 16-08-2014 в 21:44.


Отправлено: 18:42, 16-08-2014 | #15


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Цитата AlexanderSh88:
А нельзя сделать чтоб он в конце каждого txt выходного файла не добавлял одну
пустую строку? »
Цитата AlexanderSh88:
можно ли сделать четырехзначное число, к примеру 0001, 0002 и т.д »

Код: Выделить весь код
@echo off

set "$file=list.txt"
set $n=50
set $format=4

for /f %%i in ('
 set /a $format-1
') do (
 for /l %%j in (1 1 %%i) do (
  call set zeros=0%%zeros%%
  )
 )
for /f "tokens=1* delims=:" %%i in ('
 findstr /n "^" "%$file%"
') do (
 set $j=%%j
 call :sub %%i
 )
exit

:sub
 set /a $m=(%1-1)/%$n%+1
 set $m=%zeros%%$m%
 call set $m=%%$m:~-%$format%%%
 for %%i in ("%$file%") do (
  if not "%$i%"=="%$m%" (
   type nul>"%%~ni%$m%%%~xi"
   )
  set /a count+=1
  (
  if defined $j (
   for /f %%j in ('
    call echo %%count%%
   ') do (
    if not %%j==%$n% (
     set /p="%$j%"<nul
     echo.
     ) else (
     set /p="%$j%"<nul
     set count=
     )
    )
   ) else (
   echo.
   )
  )>>"%%~ni%$m%%%~xi"
 )
 set $i=%$m%
 exit /b

Последний раз редактировалось Georgio, 17-08-2014 в 03:36.

Это сообщение посчитали полезным следующие участники:

Отправлено: 00:19, 17-08-2014 | #16


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Цитата Iska:
Georgio, сейчас окажется, что некоторые строки начинаются и с «:» . »



Уже не страшно. Пусть начинаются хоть с «:::::» при использовании «findstr», хоть с «[[[[[» или «][][][» при использовании «find»:



1)

Код: Выделить весь код
@echo off

set "$file=list.txt"
set $n=50
set $format=4

for /f %%i in ('
 set /a $format-1
') do (
 for /l %%j in (1 1 %%i) do (
  call set zeros=0%%zeros%%
  )
 )
for /f "delims=" %%j in ('
 findstr /n "^" "%$file%"
') do (
 for /f "delims=:" %%i in ("%%j") do (
  call :sub %%i "%%j"
  )
 )
exit

:sub
 set /a $m=(%1-1)/%$n%+1
 set $m=%zeros%%$m%
 call set $m=%%$m:~-%$format%%%
 set "$string=%~2"
 for %%i in ("%$file%") do (
  if not "%$i%"=="%$m%" (
   type nul>"%%~ni%$m%%%~xi"
   )
  set /a count+=1
  (
  for /f %%j in ('
   call echo %%count%%
  ') do (
   if not %%j==%$n% (
    (
    for /f "delims=" %%k in ("%$string:*:=%") do (
     echo.%%k
     )
    )|| (
    echo.
    ) 
   ) else (
    (
    for /f "delims=" %%k in ("%$string:*:=%") do (
     set /p=%%k<nul
     set count=
     )
    )|| (
    echo.
    set count=
    )
   )
   )
   )>>"%%~ni%$m%%%~xi"
  )
 set $i=%$m%
 exit /b

;


2)

Код: Выделить весь код
@echo off

set "$file=list.txt"
set $n=50
set $format=4

for /f %%i in ('
 set /a $format-1
') do (
 for /l %%j in (1 1 %%i) do (
  call set zeros=0%%zeros%%
  )
 )
for /f "delims=" %%j in ('
"find /n /v ""<"%$file%""
') do (
 for /f "delims=[]" %%i in ("%%j") do (
  call :sub %%i "%%j"
  )
 )
exit

:sub
 set /a $m=(%1-1)/%$n%+1
 set $m=%zeros%%$m%
 call set $m=%%$m:~-%$format%%%
 set "$string=%~2"
 for %%i in ("%$file%") do (
  if not "%$i%"=="%$m%" (
   type nul>"%%~ni%$m%%%~xi"
   )
  set /a count+=1
  (
  for /f %%j in ('
   call echo %%count%%
  ') do (
   if not %%j==%$n% (
    (
    for /f "delims=" %%k in ("%$string:*]=%") do (
     echo.%%k
     )
    )|| (
    echo.
    ) 
   ) else (
    (
    for /f "delims=" %%k in ("%$string:*]=%") do (
     set /p=%%k<nul
     set count=
     )
    )|| (
    echo.
    set count=
    )
   )
   )
   )>>"%%~ni%$m%%%~xi"
  )
 set $i=%$m%
 exit /b

.
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:43, 17-08-2014 | #17


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Ага . Вот так посмотришь на код — и понимаешь, что до аэродрома не так уж и далеко сразу PowerShell учить захочется .

Отправлено: 08:14, 17-08-2014 | #18


Ветеран


Сообщения: 531
Благодарности: 4

Профиль | Отправить PM | Цитировать


Спасибо, все работает. А можно еще такой же вариантик, только с пустой строкой в конце (как раньше), но с переменной "format".
И еще вопросик, а если к примеру, надо 3 файла так обработать (list1, list2, list3), это можно сделать в одном bat файле или надо для каждого имени такой bat создавать?

Отправлено: 20:38, 18-08-2014 | #19


Ветеран


Сообщения: 874
Благодарности: 575

Профиль | Отправить PM | Цитировать


Цитата Alexander_88:
А можно еще такой же вариантик, только с пустой строкой в конце (как раньше), но с переменной "format".
И еще вопросик, а если к примеру, надо 3 файла так обработать (list1, list2, list3), это можно сделать в одном bat файле или надо для каждого имени такой bat создавать? »



Всё "в одном флаконе":



Код: Выделить весь код
@echo off

set string_quantity=50
set index_format=4

:: Set the value of the variable: «+» or nothing.
set final_blank_line=+

:: Enter the names of one or more files.
for %%? in (
"list1.txt"
"list2.txt"
"list3.txt"
 ) do (
 call:sub %%?
 )

del .txt .vbs
exit /b


:sub

 setlocal

 (
 echo.
 echo $$$
 for /f "delims=" %%i in ('
  findstr /n "^" %1
 ') do (
  set string=%%i
  for /f "delims=" %%j in ('
   call set /p"=%%string:*:=%%"^<nul
  ') do (
   echo.%%j
   )
  set /a count_1+=1
  for /f %%j in ('
   set /a count_1
  ') do (
   if %%j==1 (
    set /a count_2+=1
    )
   if %%j==%string_quantity% (
    echo $$$
    set count_1=
    )
   )
  )
 echo $$$
 )>.txt

 for /f %%i in ('
  set /a index_format-1
 ') do (
  for /l %%j in (1 1 %%i) do (
   call set zeros=0%%zeros%%
   )
  )
 for /l %%i in (1 1 %count_2%) do (
  set $index=%zeros%%%i
  for /f %%j in ('
   call echo %%$index:~-%index_format%%%
  ') do (
   set /p="WScript.StdOut.Write(Split(WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(".txt").ReadAll(), vbCrLf&"$$$"&vbCrLf)(%%i))"<nul>.vbs
   (
   cscript //nologo .vbs
   if "%final_blank_line%"=="+" (
    echo.
    )
   )>"%~dpns1%%j%~xs1"
   )
  )

 set /p="WScript.CreateObject("SAPI.SpVoice").Speak("Processing of the '%~nxs1' file is complete!")"<nul>.vbs
 cscript //nologo .vbs 2>nul

 endlocal
 exit /b


.
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:21, 19-08-2014 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] разбить по строкам txt

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] как разбить один txt на несколько shadowbat Скриптовые языки администрирования Windows 7 05-10-2010 07:10
[решено] Вставить строчку из одного txt в оределённое место другого txt ZeroCrash AutoIt 7 13-07-2009 07:35
Shell. Чтение текстового файла по строкам. Delphin911 Общий по Linux 11 07-04-2005 17:58
Разбить винчестер Guest Microsoft Windows 2000/XP 9 01-03-2003 23:50
Разбить MP3 Rom K Хочу все знать 9 09-10-2002 12:45




 
Переход