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

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

william-p 21-06-2013 21:14 2171913

Поправить bat для разделения txt по маске
 
http://forum.oszone.net/nextnewesttothread-187384.html
вот тут увидел очень мне подходящий вариант для разделения txt по маске

Код:

@echo off
SETLOCAL EnableDelayedExpansion

set SRC=file.txt
set DST=out_#.txt
set DLM=--- ---

for /f "usebackq delims=" %%i In ("%SRC%") do (
if not defined $F (
  set /a $N+=1& set $F=F
  set "$O=%DST:#=!$N!%"
  type nul >"!$O!") 
if not "%%i"=="%DLM%" echo %%i>>"!$O!"
if "%%i"=="%DLM%" set $F=)

Но код удаляет пустые строки из файлов на выходе. Что дописать, чтобы пустые строки не удалялись?

Iska 21-06-2013 22:19 2171941

william-p, поднять в той теме глаза выше и увидеть ещё два «подходящих» варианта кода?! Если «не подходящих» — пишите, чем именно не подходящих.

william-p 21-06-2013 22:29 2171947

Iska, конечно просмотрел там всё.
Есть такого формата текст:

<маркер>
aaa
bbb

ccc
ddd
<маркер>

<маркер>
eee

fff
<маркер>

Вот это разделяет по пустым строкам, а мне нужно по маркерам
Код:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set $F=file.txt

For /F "Tokens=1* Delims=[]" %%i In ('^<"%$F%" Find /V /N ""') Do (
If Not "%%j"=="" If Not Defined $F Set /A $N+=1& Set $F=F
If Not "%%j"=="" Echo.%%j>>out_!$N!.txt
If Defined $F If "%%j"=="" Set $F=)

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

@echo off
SETLOCAL EnableDelayedExpansion

set SRC=file.txt
set DST=out_#.txt
set DLM=--- ---

for /f "usebackq delims=" %%i In ("%SRC%") do (
if not defined $F (
  set /a $N+=1& set $F=F
  set "$O=%DST:#=!$N!%"
  type nul >"!$O!") 
if not "%%i"=="%DLM%" echo %%i>>"!$O!"
if "%%i"=="%DLM%" set $F=)

А с VBS я вообще не дружу)

Поэтому и спрашиваю, как разделить txt, чтоб по маркерам и чтоб пустые строки остались на местах.

Iska 21-06-2013 23:09 2171965

Цитата:

Цитата william-p
Есть такого формата текст: »

william-p, выложите образец реального файла. Укажите, что является маркером/маркерами. Укажите формат потребного имени файлов.

william-p 21-06-2013 23:30 2171975

Вложений: 1
Iska,
file.txt исходный, маркеры в нем "---"

Получаются
out_1.txt
out_2.txt

в них пустые строки удаляются, должны сохраняться.

william-p 21-06-2013 23:44 2171976

Кстати, VBS тоже можно, но только этот код не ищет по маркерам, только по пустой строке.

Код:

FileAll = "file.txt"

Set FSO = CreateObject("Scripting.FileSystemObject")

Set F = FSO.OpenTextFile(FileAll, 1)
MassAll = Split(Replace(F.ReadAll, Chr(10), ""), Chr(13))
F.Close

lf = True
nf = 0
For i = 0 To UBound(MassAll)
    If Len(Trim(MassAll(i))) <> 0 Then
      If lf Then
          lf = False
          nf = nf + 1
          Set F = FSO.OpenTextFile(WHere + Right("0000" + CStr(nf), 4) + ".txt", 2, True)
          F.Write MassAll(i)
      Else
          F.Write vbCrLf + MassAll(i)
      End If
    Else
      If Not lf Then F.Close
      lf = True
    End If
Next


sov44 21-06-2013 23:54 2171983

Код:

@echo off
SETLOCAL EnableDelayedExpansion
 
set SRC=file.txt
set DST=out_#.txt
set DLM=--- ---
 
for /f "tokens=1* delims=]" %%a in ('find /v /n "" ^<"%SRC%"') do (
if not defined $F (
  set /a $N+=1& set $F=F
  set "$O=%DST:#=!$N!%"
  type nul >"!$O!") 
if not "%%b"=="%DLM%" (echo.%%b>>"!$O!")
if "%%b"=="%DLM%" set $F=)


william-p 21-06-2013 23:59 2171986

sov44, ай, спасибо, всё работает! :clapping:

Iska 22-06-2013 00:31 2171996

william-p, держите:
читать дальше »
Код:

Option Explicit

Dim strSourceFile
Dim strDestFile

Dim strPattern

Dim arrContent
Dim lngCounter


If WScript.Arguments.Count = 2 Then
        strSourceFile = WScript.Arguments.Item(0)
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                If .FileExists(strSourceFile) Then
                        strPattern = WScript.Arguments.Item(1)
                       
                        WScript.Echo "Source file:  " & strSourceFile
                        WScript.Echo "Pattern line:  " & strPattern
                        WScript.Echo "Output folder: " & .GetAbsolutePathName("")
                        WScript.Echo "=================================================="
                       
                        With .OpenTextFile(strSourceFile)
                                arrContent = Split(.ReadAll(), strPattern & vbCrLf)
                                .Close
                        End With
                       
                        For lngCounter = LBound(arrContent) To UBound(arrContent)
                                strDestFile = .GetAbsolutePathName("out_" & lngCounter & ".txt")
                               
                                With .CreateTextFile(strDestFile, True)
                                        .Write arrContent(lngCounter)
                                        .Close
                                End With
                               
                                WScript.Echo strDestFile
                        Next
                Else
                        WScript.Echo "Source file [" & strSourceFile & "] not found"
                End If
        End With
Else
        WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Path to source file> <Delimiter line>"
End If

WScript.Quit 0


Пример исполнения скрипта:
читать дальше »
Код:

E:\Песочница\0282>0001.vbs file.txt "---"
Source file:  file.txt
Pattern line:  ---
Output folder: E:\Песочница\0282
==================================================
E:\Песочница\0282\out_0.txt
E:\Песочница\0282\out_1.txt
E:\Песочница\0282\out_2.txt



Время: 20:07.

Время: 20:07.
© OSzone.net 2001-