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

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

Ответить
Настройки темы
CMD/BAT - Поправить bat для разделения txt по маске

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


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

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


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=)
Но код удаляет пустые строки из файлов на выходе. Что дописать, чтобы пустые строки не удалялись?

Отправлено: 21:14, 21-06-2013

 

Ветеран


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

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


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

Отправлено: 22:19, 21-06-2013 | #2



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

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


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


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

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


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, чтоб по маркерам и чтоб пустые строки остались на местах.

Отправлено: 22:29, 21-06-2013 | #3


Ветеран


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

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


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

Отправлено: 23:09, 21-06-2013 | #4


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


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

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


Вложения
Тип файла: txt file.txt
(546 байт, 5 просмотров)

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

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

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

Отправлено: 23:30, 21-06-2013 | #5


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


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

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


Кстати, 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

Отправлено: 23:44, 21-06-2013 | #6


Ветеран


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

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


Код: Выделить весь код
@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=)
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:54, 21-06-2013 | #7


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


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

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


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

Отправлено: 23:59, 21-06-2013 | #8


Ветеран


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

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


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:31, 22-06-2013 | #9



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Нужен bat-ник для поиска и удаления файлов и папок по маске Nun-Nun Скриптовые языки администрирования Windows 14 08-11-2014 09:53
CMD/BAT - bat файл для чтения папок и создания txt файлов NibelungXXX Скриптовые языки администрирования Windows 1 21-06-2013 20:47
CMD/BAT - создать Пакетный файл, предназначенный для удаления файлов по маске, расположенных в Sew12 Скриптовые языки администрирования Windows 2 21-11-2012 05:42
Поиск слова в txt затем поиск по маске "(383)" и вывод инфы rustoss AutoIt 10 29-09-2011 15:27
CMD/BAT - [решено] Выбор данных из txt по маске hxygen Скриптовые языки администрирования Windows 4 24-10-2010 15:52




 
Переход