Показать полную графическую версию : [решено] разбить по строкам txt
shadowbat
29-08-2010, 20:40
есть list.txt
как разбить его на list01.txt, list02.txt ... по 50 строк?
т.е. если есть list.txt в котором 400 строк - то разбить его на 8 txt-файлов по 50 строк
kiripanda
30-08-2010, 00:24
Построчное разрезание TXT-файла (http://forum.wincmd.ru/viewtopic.php?p=58113#58113)
shadowbat
30-08-2010, 08:20
куда в тотал командере копировать этот текст?
'=====================================================================
' Разрезание выделенных файлов на заданное количество строк
'
' Параметры:
' {файл-список} [{количество строк}]
'
' Пример вызова из 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
@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
shadowbat
30-08-2010, 12:06
gora благодарю! :yes:
до кучи еще вариант:
@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
вариант на AWK (http://gnuwin32.sourceforge.net/packages/gawk.htm):
@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
kiripanda
01-09-2010, 02:25
Цитировать »Сохранить как текстовый файл с расш. .vbs
Создать кнопку с парам. %L 50 или запускать split.vbs <список_файлов_по_одному_в_строке> 50
Для скрипта от Volniy
Заменить Const n=50 ' число строк в каждом "куске"
Запускать split.vbs list.txt
Цитировать »Пропускаются пустые строки.
Цитировать »В конце каджой строки дабавляется "
Исправлено.
hc1ewza161
29-07-2012, 19:17
не сочтите на пристрастие к некрофильству))
но вариант горы (да и других) разбивает с пустой строчкой.
а именно задаю 2 тыс строк, он мне разбивает на 2000 строк текста и одну пустую. как с этим бороться?
но вариант горы … разбивает с пустой строчкой. »
Не подтверждаю.
Выложите Ваш код, Ваш исходный файл и результирующие файлы в архиве.
AlexanderSh88
16-08-2014, 14:32
добрый день, подскажите как исправить проблему в этом варианте
@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 файле бывают строки, начинающиеся со знака [
Дак вот в выходных файлах этот знак удаляется, как избежать этого?
подскажите как исправить проблему в этом варианте
В моем txt файле бывают строки, начинающиеся со знака [
Дак вот в выходных файлах этот знак удаляется, как избежать этого? »
Напрямую — никак, delims он и есть delims. Используйте другие варианты.
@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
Georgio, сейчас окажется, что некоторые строки начинаются и с «:» :lol:.
AlexanderSh88
16-08-2014, 18:42
спасибо, работает!
А нельзя сделать чтоб он в конце каждого txt выходного файла не добавлял одну
пустую строку? »
можно ли сделать четырехзначное число, к примеру 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, сейчас окажется, что некоторые строки начинаются и с «:» . »
Уже не страшно. Пусть начинаются хоть с «:::::» при использовании «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
.
Ага ;). Вот так посмотришь на код — и понимаешь, что до аэродрома не так уж и далеко сразу PowerShell учить захочется :lol:.
Alexander_88
18-08-2014, 20:38
Спасибо, все работает. А можно еще такой же вариантик, только с пустой строкой в конце (как раньше), но с переменной "format".
И еще вопросик, а если к примеру, надо 3 файла так обработать (list1, list2, list3), это можно сделать в одном bat файле или надо для каждого имени такой bat создавать?
А можно еще такой же вариантик, только с пустой строкой в конце (как раньше), но с переменной "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
.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.