Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] разбить по строкам txt (http://forum.oszone.net/showthread.php?t=184176)

shadowbat 29-08-2010 20:40 1484402

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

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

kiripanda 30-08-2010 00:24 1484522

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

shadowbat 30-08-2010 08:20 1484625

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


Код:

'=====================================================================
' Разрезание выделенных файлов на заданное количество строк
'
' Параметры:
' {файл-список} [{количество строк}]
'
' Пример вызова из 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


gora 30-08-2010 11:19 1484712

Код:

@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 1484751

gora благодарю! :yes:

amel27 30-08-2010 13:14 1484801

до кучи еще вариант:
Код:

@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 30-08-2010 18:39 1485039

вариант на 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


kiripanda 01-09-2010 02:25 1486138

Цитата:

Цитата shadowbat
Цитировать »

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

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

Цитата:

Цитата gora
Цитировать »

Пропускаются пустые строки.

читать дальше »
Цитата:

Цитата amel27
Цитировать »

В конце каджой строки дабавляется "
Исправлено.

hc1ewza161 29-07-2012 19:17 1961151

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

Iska 29-07-2012 20:37 1961186

Цитата:

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

Не подтверждаю.

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

AlexanderSh88 16-08-2014 14:32 2390053

добрый день, подскажите как исправить проблему в этом варианте
Код:

@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 файле бывают строки, начинающиеся со знака [
Дак вот в выходных файлах этот знак удаляется, как избежать этого?

Iska 16-08-2014 15:34 2390078

Цитата:

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

Напрямую — никак, delims он и есть delims. Используйте другие варианты.

Georgio 16-08-2014 15:39 2390083

Код:

@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


Iska 16-08-2014 15:46 2390089

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

AlexanderSh88 16-08-2014 18:42 2390152

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

Georgio 17-08-2014 00:19 2390236

Цитата:

Цитата 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 07:43 2390267

Цитата:

Цитата 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


.

Iska 17-08-2014 08:14 2390269

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

Alexander_88 18-08-2014 20:38 2390910

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

Georgio 19-08-2014 04:21 2391053

Цитата:

Цитата 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



.

Iska 19-08-2014 06:35 2391060

Цитата:

Цитата Alexander_88
…можно сделать в одном bat файле или надо для каждого имени такой bat создавать? »

Вы раз от разу задаёте похожий вопрос. Ответ такой: код выносится в процедуру («:метка» … «exit /b»|«goto :eof»), которая вызывается потребное число раз с передачей ей параметров.

Alexander_88 19-08-2014 10:14 2391112

Спасибо большое, еще и со звукок :clapping:

Alexander_88 27-08-2014 03:11 2394639

а такой код нельзя заставить работать если txt сохранен в формате unicode text file ?
просто программа по умолчанию сохраняет в формате "unicode text file", приходится каждый раз менять тип на "text file" или как - тоизбавится от этого сохранения в unicode text file, чтобы по умолчанию, сразу предлагалось в text file))

Georgio 27-08-2014 12:57 2394792

Alexander_88, нижеприведённое "достижение науки" с "UTF-8" справляется. Но даже если этот код не подойдёт для обработки Ваших "юникодных" файлов, то используйте его для обработки других файлов, т. к. результаты его работы корректнее результатов работы предыдущего кода.



Код:

@echo off
chcp 1251>nul

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 ('
  find /n /v ""^<%1
 ') do (
  set string=%%i
  (
  for /f "delims=" %%j in ('
  call set /p"=%%string:*]=%%"^<nul
  ') do (
  echo %%j
  )
  )|| (
  echo.
  )
  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


Alexander_88 27-08-2014 12:59 2394795

Georgio понял, спасибо вам за помощь

Alexander_88 27-08-2014 13:17 2394802

Georgio, а имена выводимых файлов не должны меняться? почему то они у меня не много не такие получаются.
если файл называется Alexander, получаются файлы ALEXAN~101, ALEXAN~102, ALEXAN~103 ................ чисел в нумерации установлено 2

Georgio 27-08-2014 13:34 2394813

Alexander_88, попробуйте:



Код:

@echo off
chcp 1251>nul

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 ('
  find /n /v ""^<%1
 ') do (
  set string=%%i
  (
  for /f "delims=" %%j in ('
  call set /p"=%%string:*]=%%"^<nul
  ') do (
  echo %%j
  )
  )|| (
  echo.
  )
  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.
    )
  )>"%~dpn1%%j%~x1"
  )
  )

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

 endlocal
 exit /b



.

Alexander_88 27-08-2014 13:53 2394827

Работает, спасибо :yahoo:

blackeangel 06-11-2015 20:15 2572290

Всем привет. Есть такая проблема.Необходимо разбить файл на 3 части. Причем кол-во строк в каждой части разное.
Разбивать так: 1 файл от начала и до строки которая задается переменной; 2ой файл между 2мя переменными(так как переменные получаются по найденым словам в тексте и их номера строк),3й файл - от второй переменной и до конца файла.
Желательно через CMD сия мероприятие производить...
знаю что найти сномер строки вот так вот
Цитата:

Цитата Bruce Wayne
for /f "delims=[] tokens=1*" %%a in ('find /i /n "text" ^< "start.txt"') do echo number=%%a »


Georgio 07-11-2015 04:44 2572357

Код:

@echo off

set "file=example.txt"
set "marker_1=слово (или фраза), по которому нужно определить первую строку"
set "marker_2=слово (или фраза), по которому нужно определить вторую строку"

for /f "delims=:" %%i in ('
 2^>nul (findstr/iln /c:"%marker_1%" /c:"%marker_2%" "%file%"^& ^<"%file%" find/c /v ""^)
') do (
 if not defined x (set x=%%i) else (if not defined y (set y=%%i) else (set z=%%i))
)
for %%i in ("%file%") do <%%i (
 for %%? in (1 2 3) do 2>nul del "%%~ni_%%?%%~xi"
 for /l %%j in (1 1 %z%) do (
  if %%j leq %x% (set n=1) else (if %%j lss %y% (set n=2) else (set n=3))
  for /f %%k in ('set/a n') do (
  set x=& set/p x=& >>"%%~ni_%%k%%~xi" (
  if defined x (cmd/v/c echo.!x!) else (echo.)
  )
  )
 )
)

exit/b


blackeangel 07-11-2015 09:59 2572387

Georgio, спасибо огромное )))

blackeangel 07-11-2015 18:07 2572481

Georgio, а скажите есть в бат какая нибудь команда типа for из c# ?

Foreigner 07-11-2015 18:28 2572488

blackeangel, если имеется ввиду инкрементация:
Код:

for /l %%i in (0,1,9) do echo %%i

blackeangel 07-11-2015 19:09 2572501

Georgio, ваш код по разбитию не работает правильно...он выдает 3 файла:
1- как оригинал,2 и 3 пустые.
Я привел его к такому вот виду
Код:

@echo off

set "file=init.rc"
set "marker_1=#Camera"
set "marker_2=#/dev/RT_Monitor"

for /f "delims=:" %%i in ('
 2^>nul (findstr/iln /c:"%marker_1%" /c:"%marker_2%" "%file%"^& ^<"%file%" find/c /v ""^)
') do (
 if not defined x (set x=%%i) else (if not defined y (set y=%%i) else (set z=%%i))
)
for %%i in ("%file%") do <%%i (
 for %%? in (1 2 3) do 2>nul del "%%~ni_%%?%%~xi"
 for /l %%j in (1 1 %z%) do (
  if %%j leq %x% (set n=1) else (if %%j lss %y% (set n=2) else (set n=3))
  for /f %%k in ('set/a n') do (
  set x=& set/p x=& >>"%%~ni_%%k%%~xi" (
  if defined x (cmd/v/c echo.!x!) else (echo.)
  )
  )
 )
)

exit/b

прилагаю то что получил на выходе+оригинал

blackeangel 07-11-2015 19:16 2572503

Foreigner, нет,что то типа
Код:

::находим строки начала и конца
for /f "delims=[] tokens=1*" %%b in ('find /i /n "#Camera" ^< "init.rc"') do
for /f "delims=[] tokens=1*" %%c in ('find /i /n "#/dev/RT_Monitor" ^< "init.rc"') do
::содержимое между ними кидаем в новый файл
for /l %%a=%%b in (%%b,1,%%c) do echo %%a>>1.txt

но оно не работает

Foreigner 07-11-2015 19:29 2572506

Цитата:

Цитата blackeangel
но оно не работает »

А должно? Нет такого, как в сишарп. Юзайте powershell, тем более если знакомы с C#. Поясните ваш пример, иначе он бессмысленный.

Iska 07-11-2015 19:29 2572507

Цитата:

Цитата blackeangel
нет,что то типа »

Код:

for /l %%a in (%b%,1,%c%) do echo %%a>>1.txt
Но это просто выведет последовательность чисел от «%b%» до «%с%» с шагом «1» в файл «1.txt», а вовсе не то, что Вы явно планировали получить.

Давайте начнём с простого и понятного: упакуйте образец исходного файла в архив, выложите архив на RGhost. Опишите потребную задачу полностью — без учёта:
Цитата:

Цитата blackeangel
(так как переменные получаются по найденым словам в тексте и их номера строк) »

а с самого начала.

blackeangel 07-11-2015 19:43 2572510

Iska, задача проста-заменить абзац текста из одного файла в другом по 2м меткам которые уже писались парой постов выше в коде.То есть они этих файлах присутствуют.Файл я прикладывал там же где и код(большой который).Реализовать это на батнике нереально, поэтому решил обойти это в 4 шага.
1.Из первого файла диапазон между метками отправить в новый файл
2.Второй файл разбить на 3 части ( по условию что писалось на предыдущей стр)
3. Заменить одну часть на файл из п.1
4. Соединить всё в новый файл который нужен
Самое сложное оказались первые 2 пункта..

Foreigner 07-11-2015 20:12 2572518

Цитата:

Цитата blackeangel
нет,что то типа »

Код:

sed -n "/#Camera/,/#\/dev\/RT_Monitor/ p"  init.rc | sed -r "/^.+#.+$/ d" > другой_файл

blackeangel 07-11-2015 20:36 2572527

Foreigner, sed это программа, так понимаю, для поиска и замены текста?

Iska 07-11-2015 21:06 2572535

blackeangel, у Вас там в файле Unix'овские концы строк. И хотелось бы увидеть образцы Ваших файлов, из которых Вы будете делать замену (разумеется, так же — в архиве).

Вот примерная болванка на WSH на пробу:
Скрытый текст
Код:

Option Explicit

Dim strSourceFile
Dim strReplaceFile

Dim strContent
Dim strReplace


strSourceFile = "C:\Мои проекты\init\init.rc"
strReplaceFile = "C:\Мои проекты\init\Replace.rc"

With WScript.CreateObject("Scripting.FileSystemObject")
        If .FileExists(strSourceFile) Then
                If .FileExists(strReplaceFile) Then
                        With .OpenTextFile(strSourceFile)
                                strContent = .ReadAll()
                                .Close
                        End With
                       
                        With .OpenTextFile(strReplaceFile)
                                strReplace = .ReadAll()
                                .Close
                        End With
                       
                        With WScript.CreateObject("VBScript.RegExp")
                                .Global = True
                                .MultiLine = True
                                .IgnoreCase = True
                                .Pattern = "^(    #Camera\n)([\s\S]+?)(\n    #/dev/RT_Monitor)$"
                               
                                If .Test(strContent) Then
                                        strContent = .Replace(strContent, "$1" & strReplace & "$3")
                                Else
                                        WScript.Echo "Can't find pattern [" & .Pattern & "]."
                                        WScript.Quit 3
                                End If
                        End With
                       
                        With .CreateTextFile(strSourceFile + ".txt")
                                .Write strContent
                                .Close
                        End With
                Else
                        WScript.Echo "Can't find replace file [" & strReplaceFile & "]."
                        WScript.Quit 2
                End If
        Else
                WScript.Echo "Can't find source file [" & strSourceFile & "]."
                WScript.Quit 1
        End If
End With

WScript.Quit 0


Сохраните приведённый код в файл с расширением .vbs, замените выделенное на пути к Вашим реальным исходному и заменяющему файлам. Результирующий файл получит имя исходного плюс «.txt». Посмотрите, что получается.

Цитата:

Цитата blackeangel
Foreigner, sed это программа, так понимаю, для поиска и замены текста? »

Это портированная из Unix утилита, редактор потока (Stream EDitor — SED). Для Windows можно взять, например, отсюда.

Georgio 07-11-2015 21:10 2572538

blackeangel, надо было предупредить, что у Вас исходный файл в формате UNIX.


Код:

Код:

@echo off

set "file=init.rc"
set "marker_1=#Camera"
set "marker_2=#/dev/RT_Monitor"

for /f "delims=:" %%i in ('
 2^>nul findstr/iln /c:"%marker_1%" /c:"%marker_2%" "%file%"
') do (
 if not defined x (set x=%%i) else (set y=%%i)
)
for %%i in ("%file%") do (
 for %%? in (1 2 3) do 2>nul del "%%~ni_%%?%%~xi"
 for /f "delims=" %%j in ('2^>nul findstr/n "^" %%i') do (
  set z=%%j
  for /f "delims=:" %%k in ("%%j") do (
  if %%k leq %x% (set n=1) else (if %%k lss %y% (set n=2) else (set n=3))
  for /f %%l in ('set/a n') do >>"%%~ni_%%l%%~xi" cmd/v/c echo.!z:*:^^=!
  )
 )
)

exit/b

.


Полученные файлы будут в формате Windows.

blackeangel 07-11-2015 22:01 2572544

Iska, спасибо большое конечно за vbs, но на моей машине эти скрипты не запустятся,так же как и js

Iska 07-11-2015 22:01 2572545

Цитата:

Цитата blackeangel
но на моей машине эти скрипты не запустятся,так же как и js »

Запрет на исполнение скриптов?

blackeangel 07-11-2015 22:17 2572548

Iska, наверное, поэтому предпочтение exe и bat

blackeangel 08-11-2015 09:37 2572645

Georgio, спасибо, скрипт отработал великолепно

blackeangel 08-11-2015 09:52 2572648

Foreigner, спасибо за вывод из файла нужных строк

blackeangel 09-11-2015 08:55 2572929

Сделал сегодня так
Код:

echo #blackeangel>>init.rc
::выносит нужные строки в файл
:: 1й кусок
sed.exe -n "/# Copyright/,/#Camera/ p"  init.rc | sed -r "/^.+#.+$/ d" > init1.rc
:: 2й кусок
sed.exe -n "/#Camera/,/#\/dev\/RT_Monitor/ p"  init.rc | sed -r "/^.+#.+$/ d" > init2.rc
:: 3й кусок
sed.exe -n "/#\/dev\/RT_Monitor/,/#blackeangel/ p"  init.rc | sed -r "/^.+#.+$/ d" > init3.rc

На выходе получил файл без комментариев содержащих пробелы.В чем проблема?
Файлы прилагаются,оригинал и разбитые

blackeangel 09-11-2015 17:51 2573099

Цитата:

Цитата Georgio (Сообщение 2572538)
blackeangel, надо было предупредить, что у Вас исходный файл в формате UNIX.

Полученные файлы будут в формате Windows.

А как тогда вернуть назад в формат Unix?

Marakas5 10-11-2015 09:19 2573253

Здравствуйте! Облазил весь интернет, решения не нашел, как модифицировать примеры в этом топике под себя понять не могу, поэтому прошу вашей помощи, надеюсь, не откажете.
Ситуация следующая: имеется file.txt, который нужно разбить на равное количество строк (с этим я справился), но сохранить результаты в разные папки (их список построчно лежит в list.txt) с одним и тем же (finish.txt) именем. Папок физически на диске нет, т.е. их надо сначала создать. Названия папок могут содержать точки.
Подскажите, пожалуйста, как это можно реализовать. Большое вам спасибо.

Iska 10-11-2015 09:48 2573264

Цитата:

Цитата Marakas5
имеется file.txt, »

Хорошо бы было упаковать его в архив и приложить к сообщению.

Цитата:

Цитата Marakas5
который нужно разбить на равное количество строк »

Равное — это на сколько: надвое, натрое…?

Цитата:

Цитата Marakas5
с этим я справился) »

Покажите Ваш код.

Цитата:

Цитата Marakas5
их список построчно лежит в list.txt »

Аналогично: упаковать его в архив и приложить к сообщению.

Marakas5 10-11-2015 10:25 2573272

Вложений: 1
Iska, спасибо за ваш ответ.
Цитата:

Равное — это на сколько: надвое, натрое…?
Извините, не уточнил - по 5 строк.
Цитата:

Покажите Ваш код
Код:

setlocal enabledelayedexpansion
set q=0
set N=5
for /F "delims=  " %%i in (file.txt) do (
set /a q+=1
if !q! GTR !N! set /a N+=5
@echo %%i >> file!N!.txt
)

только он подглючивает, может заменить первый символ, добавляет пробелы в конце и в каждом файле создается лишняя строка, пока не понимаю как это побороть. Ну и сохранение тут работает в разные файлы, что не удовлетворяет условию задачи.
По поводу file.txt и list.txt - их содержимое может меняться, но пример я приложу.
Еще, возможно, это важный момент - исходный файл сохранен в UTF-8 и получившиеся файлы тоже должны быть в этой кодировке. И еще не уточнил, что в строках может встречаться символ "-", возможно, это важно.

Iska 10-11-2015 10:48 2573278

Цитата:

Цитата Marakas5
Еще, возможно, это важный момент - исходный файл сохранен в UTF-8 »

А приложенный файл — в ANSI-1251. Как сие прикажете понимать?

Marakas5 10-11-2015 11:28 2573290

Вложений: 1
Iska, вы помогли мне разобраться с интересной особенностью Notepad++ - в случае, если точка не стоит рядом с любой из строк "Кодировать в ...", то при попытке перекодировки ничего не происходит. В этом случае надо наживать "Преобразовать в..." и после этого уже можно кодировать. Не знал такого. Спасибо за ваше замечание.

Прикладываю исправленное.

blackeangel 10-11-2015 16:20 2573379

Разбил файл вот так,может кому нибудь пригодится
if exist "Port\boot\rmdisk\*.tmp" del /q Port\boot\rmdisk\*.tmp >nul
::1 файл
for /f "delims=[] tokens=1*" %%a in ('find /i /n "# Add by MTK" ^< "Port\boot\rmdisk\init.rc"') do (
bin\sed.exe -n "1,%%a p" Port\boot\rmdisk\init.rc >Port\boot\rmdisk\init_1.tmp
)
::2 файл
bin\sed.exe -n "/# Add by MTK/,/# End of adding by MTK drivers/ p" Stok\boot\rmdisk\init.rc >Port\boot\rmdisk\init_2.tmp
bin\sed.exe -i "/# Add by MTK/ d" Port\boot\rmdisk\init_2.tmp
bin\sed.exe -i "/# End of adding by MTK drivers/d" Port\boot\rmdisk\init_2.tmp
::3 файл
bin\sed.exe -n "/# End of adding by MTK drivers/, $p" Port\boot\rmdisk\init.rc > Port\boot\rmdisk\init_3.tmp


Хотя может есть предложения как сделать проще?


Время: 12:22.

Время: 12:22.
© OSzone.net 2001-