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

Компьютерный форум 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

 

Старожил


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

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


Построчное разрезание TXT-файла

Отправлено: 00:24, 30-08-2010 | #2



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

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


Старожил


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

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


куда в тотал командере копировать этот текст?
читать дальше »


Код: Выделить весь код
'===================================================================== 
' Разрезание выделенных файлов на заданное количество строк 
' 
' Параметры: 
' {файл-список} [{количество строк}] 
' 
' Пример вызова из TC: 
' %L 2 
'===================================================================== 
Option Explicit 
'======== Изменяемые параметры ======================================= 
Const DefRowCount = 1 'Количество строк по умолчанию 
Const NameMode    = 0 'Режим формирования имен файлов 
'Варианты режима формирования имен: 
'  0 - {Имя}.{Расширение}.{Номер части} 
'  1 - {Имя}.{Номер части}.{Расширение} 
'  2 - {Имя}_{Номер части}.{Расширение} 
'  3 - {Имя}[{Номер части}].{Расширение} 
'===================================================================== 
Dim Mess, FSO, WSH, FF, RowCount 
SetMess 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set WSH = CreateObject("WScript.Shell") 

On Error Resume Next 
CheckParam:CheckErr 
Main:CheckErr 
'MessBox Mess(3), 3 
Quit 0 

Sub Main 
  Dim F 
  For Each F In Split(FSO.OpenTextFile(FF).ReadAll, vbNewLine) 
    Action F 
  Next 
End Sub 

Sub Action(pPath) 
  Dim lText, lT, lCnt, lPath, lArr, lR, lNum, lNewPath 
  If pPath = "" Then Exit Sub 
  lPath = GetPath(pPath) 
  If Not FSO.FileExists(lPath) Then Exit Sub 
  lText = FSO.OpenTextFile(lPath).ReadAll 
  lCnt  = 0 
  lArr  = CutText(lText, RowCount) 
  lR    = Len(CStr(UBound(lArr))) 
  For Each lT In lArr 
    lNum = Right(String(lR, "0") & CStr(lCnt), lR) 
    Select Case NameMode 
      Case 0 lNewPath = lPath & "." & lNum 
      Case 1 lNewPath = FSO.GetParentFolderName(lPath) & "\" & FSO.GetBaseName(lPath) &_ 
                        "." & lNum & "." & FSO.GetExtensionName(lPath) 
      Case 2 lNewPath = FSO.GetParentFolderName(lPath) & "\" & FSO.GetBaseName(lPath) &_ 
                        "_" & lNum & "." & FSO.GetExtensionName(lPath) 
      Case 3 lNewPath = FSO.GetParentFolderName(lPath) & "\" & FSO.GetBaseName(lPath) &_ 
                        "[" & lNum & "]." & FSO.GetExtensionName(lPath) 
    End Select 
    FSO.CreateTextFile(lNewPath, True).Write lT 
    lCnt = lCnt + 1 
  Next 
End Sub 

Function CutText(pText, pRowCount) 
  Dim lArr, lR, lR1, l, l1, l2, l3 
  lArr = Split(pText, vbNewLine) 
  lR   = UBound(lArr) 
  lR1  = -Int(-(lR + 1)/pRowCount) - 1 
  ReDim lArr1(lR1) 
  For l = 0 To lR1 
    l1 = (l + 1) * pRowCount - 1 
    l2 = pRowCount - 1 
    If l1 > lR Then l2 = lR - l * pRowCount 
    For l3 = 0 To l2 
      lArr1(l) = lArr1(l) & lArr(l3 + l1 - pRowCount + 1) & vbNewLine 
    Next 
  Next 
  lArr1(lR1) = Left(lArr1(lR1), Len(lArr1(lR1)) - Len(vbNewLine)) 
  CutText = lArr1 
End Function 

Sub CheckParam 
  With WScript 
    If .Arguments.Count = 0 Then Err.Raise vbObjectError + 1, "", Mess(1) 
    FF = GetPath(.Arguments(0)) 
    If Not FSO.FileExists(FF) Then Err.Raise vbObjectError + 2, "", Mess(2) 
    If .Arguments.Count > 1 Then 
      RowCount = .Arguments(1) 
      If IsNumeric(RowCount) Then 
        RowCount = CInt(RowCount) 
      Else 
        RowCount = DefRowCount 
      End If 
    Else 
      RowCount = DefRowCount 
    End If 
  End With 
End Sub 

Function GetPath(pPath) 
  GetPath = FSO.GetAbsolutePathName(WSH.ExpandEnvironmentStrings(pPath)) 
End Function 

Sub CheckErr 
  If Err.Number <> 0 Then 
    MessBox "Возникла ошибка № " & Err.Number & ":" & vbNewLine & Err.Description, 1 
    Quit Err.Number 
  End If 
End Sub 

Function MessBox(pMess, pMode) 
  Dim lIcon 
  Select Case pMode 
    Case 1 lIcon = vbCritical    + vbOKOnly 
    Case 2 lIcon = vbExclamation + vbOKOnly 
    Case 3 lIcon = vbInformation + vbOKOnly 
  End Select 
  MessBox = MsgBox(pMess, lIcon, Mess(0)) 
End Function 

Sub SetMess 
  Set Mess = CreateObject("Scripting.Dictionary") 
  With Mess 
    .Add 0,  "Разрезание файлов на строки" 
    .Add 1,  "Не указаны параметры!" 
    .Add 2,  "Файл-список не существует!" 
    .Add 3,  "Операция завершена." 
  End With 
End Sub 

Sub Quit(pQuitCode) 
  Set Mess = Nothing 
  Set WSH  = Nothing 
  Set FSO  = Nothing 
  WScript.Quit pQuitCode 
End Sub

Отправлено: 08:20, 30-08-2010 | #3


Аватара для gora

Ушёл из жизни


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

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


Код: Выделить весь код
@Echo Off
SetLocal enabledelayedexpansion
Set list=list.txt
:: Число строк в файле на выходе
Set str=50

Set Num=%str%& Set File=0
For /F "tokens=* usebackq delims=" %%i In ("%list%") Do (
	Set /a Num+=1
	If !Num! GEQ %str% (
		Set Num=0
		Set /a File+=1
		Set nFile=0!File!
		Set nFile=!nFile:~-2!
		Echo %%i>list!nFile!.txt
	) Else Echo %%i>>list!nFile!.txt
)
Pause
Exit

Последний раз редактировалось gora, 30-08-2010 в 11:46.

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

Отправлено: 11:19, 30-08-2010 | #4


Старожил


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

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


gora благодарю!

Отправлено: 12:06, 30-08-2010 | #5


Googler


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

Профиль | Отправить 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
P.S. штатным средствам CMD присуще множество разных ограничений, иногда их можно обойти... поэтому решать задачу без описания обрабатываемого текста не имеет смысла, в таких случаях надежней воспользоваться сторонними утилитами типа AWK

Последний раз редактировалось amel27, 01-09-2010 в 05:52. Причина: очепятка


Отправлено: 13:14, 30-08-2010 | #6


Googler


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

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


вариант на AWK:
Код: Выделить весь код
@echo off
set $n=50

for /f "delims=" %%i in ('^<list.txt find /v /c ""') do set /a $m=100+%%i/%$n%
for /l %%i in (100,1,%$m%) do set /a $i=%%i& call :sub
:sub
(awk -v S=%$i:~-2% -v N=%$n% "{L+=1;if (L>S*N && L<S*N+N+1) {print $0}}"
) <list.txt >list%$i:~-2%.txt

Отправлено: 18:39, 30-08-2010 | #7


Старожил


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

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


Цитата shadowbat:
Цитировать »
Сохранить как текстовый файл с расш. .vbs
Создать кнопку с парам. %L 50 или запускать split.vbs <список_файлов_по_одному_в_строке> 50

Для скрипта от Volniy
Заменить Const n=50 ' число строк в каждом "куске"
Запускать split.vbs list.txt

Цитата gora:
Цитировать »
Пропускаются пустые строки.

читать дальше »
Цитата amel27:
Цитировать »
В конце каджой строки дабавляется "
Исправлено.

Последний раз редактировалось kiripanda, 01-09-2010 в 22:19.

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

Отправлено: 02:25, 01-09-2010 | #8


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


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

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


не сочтите на пристрастие к некрофильству))
но вариант горы (да и других) разбивает с пустой строчкой.
а именно задаю 2 тыс строк, он мне разбивает на 2000 строк текста и одну пустую. как с этим бороться?

Отправлено: 19:17, 29-07-2012 | #9


Ветеран


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

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


Цитата hc1ewza161:
но вариант горы … разбивает с пустой строчкой. »
Не подтверждаю.

Выложите Ваш код, Ваш исходный файл и результирующие файлы в архиве.

Отправлено: 20:37, 29-07-2012 | #10



Компьютерный форум 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




 
Переход