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

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

Ответить
Настройки темы
CMD/BAT - Разделение текстового файла на части без разделения абзацев

Пользователь


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

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


Здравствуйте, помогите с написанием bat файла, который разбивает большой текстовый файл на части примерно на 500 Кб, но не разбивая абзацы.

То есть скрипт должен отсчитать 500 Кб, потом дойти до двух пустых строк и в этом месте разделить файл.

Отправлено: 08:19, 07-07-2013

 

Ветеран


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

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


Re:Flex, выложите часть файла в виде нескольких абзацев, упакованную в архив.

Цитата Re:Flex:
примерно на 500 Кб »
Цитата Re:Flex:
То есть скрипт должен отсчитать 500 Кб, »
Примерно — это сколько? Вас устроит ближайшее значение до 500 Кб или ближайшее значение свыше 500 Кб? Кстати, почему такая некруглая цифра, почему не 512?

Отправлено: 08:33, 07-07-2013 | #2



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

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


Пользователь


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

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


Эти все вопросы не критичны для меня, поскольку все абзацы маленькие от 1 до 2 Кб, а размер сегментов я потом подправлю после экспериментов.

Отправлено: 09:00, 07-07-2013 | #3


Пользователь


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

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


Цитата Foreigner:
PowerShell устроит? »
Спасибо конечно, но нет, у меня он похоже отсутствует в системе

Отправлено: 10:22, 07-07-2013 | #4


Ветеран


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

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


Re:Flex, на WSH, пробуйте:
читать дальше »
Код: Выделить весь код
Option Explicit

Dim lngPartSize
Dim intMaxPartCount

Dim strSourceFile

Dim objRegExp
Dim objMatch

Dim strContent

Dim intPartNumber
Dim lngPos
Dim strPartFileName


If WScript.Arguments.Count = 1 Then
	With WScript.CreateObject("Scripting.FileSystemObject")
		strSourceFile = .GetAbsolutePathName(WScript.Arguments.Item(0))
		
		lngPartSize     = 500 * 2^10 ' 500Kb
		intMaxPartCount = 999        ' Не более 999 частей
		
		If .FileExists(strSourceFile) Then
			Set objRegExp = WScript.CreateObject("VBScript.RegExp")
			
			With objRegExp
				.Global  = True
				
				.Pattern = "[\s\S]{" & CStr(lngPartSize) & "}[\s\S]*?\r\n\r\n"
			End With
			
			With .OpenTextFile(strSourceFile)
				strContent = .ReadAll()
				.Close
			End With
			
			intPartNumber = 0
			lngPos        = 0
			
			If objRegExp.Test(strContent) Then
				For Each objMatch In objRegExp.Execute(strContent)
					intPartNumber = intPartNumber + 1
					strPartFileName = .BuildPath(.GetParentFolderName(strSourceFile), .GetBaseName(strSourceFile) & ".part" & Right(String(Len(CStr(intMaxPartCount)), "0") & CStr(intPartNumber), Len(CStr(intMaxPartCount))) & "." & .GetExtensionName(strSourceFile))
					
					With .CreateTextFile(strPartFileName, True)
						.Write objMatch.Value
						.Close
					End With
					
					lngPos = objMatch.FirstIndex + objMatch.Length
					WScript.Echo FormatPercent(lngPos / Len(strContent), 1) & ": Write file [" & strPartFileName & "]: " & CStr(objMatch.Length) & " b."
				Next
			End If
			
			intPartNumber = intPartNumber + 1
			strPartFileName = .BuildPath(.GetParentFolderName(strSourceFile), .GetBaseName(strSourceFile) & ".part" & Right(String(Len(CStr(intMaxPartCount)), "0") & CStr(intPartNumber), Len(CStr(intMaxPartCount))) & "." & .GetExtensionName(strSourceFile))
			
			With .CreateTextFile(strPartFileName, True)
				.Write Right(strContent, Len(strContent) - lngPos)
				.Close
			End With
			
			WScript.Echo FormatPercent(1, 1) & ": Write file [" & strPartFileName & "]: " & CStr(Len(strContent) - lngPos) & " b."
		Else
			WScript.Echo "Source file [" & strSourceFile & "] not found."
		End If
	End With
Else
	WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Source file>"
End If

WScript.Quit 0


Возможный результат (для некоего случая с «lngPartSize = 30» и файлом «0001.txt»):
читать дальше »
Код: Выделить весь код
8.9%: Write file [E:\Песочница\0289\0001.part001.txt]: 62 b.
18.0%: Write file [E:\Песочница\0289\0001.part002.txt]: 64 b.
25.9%: Write file [E:\Песочница\0289\0001.part003.txt]: 55 b.
33.8%: Write file [E:\Песочница\0289\0001.part004.txt]: 55 b.
41.6%: Write file [E:\Песочница\0289\0001.part005.txt]: 55 b.
53.4%: Write file [E:\Песочница\0289\0001.part006.txt]: 82 b.
65.1%: Write file [E:\Песочница\0289\0001.part007.txt]: 82 b.
76.8%: Write file [E:\Песочница\0289\0001.part008.txt]: 82 b.
88.6%: Write file [E:\Песочница\0289\0001.part009.txt]: 82 b.
100.0%: Write file [E:\Песочница\0289\0001.part010.txt]: 80 b.

Последний раз редактировалось Iska, 07-07-2013 в 19:51.

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

Отправлено: 19:44, 07-07-2013 | #5


Пользователь


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

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


Цитата Iska:
на WSH, пробуйте »
Вот спасибо, всё работает как надо, только системные требования у скрипта безграничные. Он весь файл в память помещает?

Отправлено: 14:43, 08-07-2013 | #6


Ветеран


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

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


Цитата Re:Flex:
Он весь файл в память помещает? »
Весь:
Код: Выделить весь код
…
			With .OpenTextFile(strSourceFile)
				strContent = .ReadAll()
				.Close
			End With
…
А Ваш «большой текстовый файл» какого размера?
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:51, 08-07-2013 | #7


Пользователь


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

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


Пока что ~430 Мб максимальный попадался, в будущем может побольше попадаться.

Надеюсь не будет проблемы с "Не более 999 частей" с сегментами по 485 Кб и исходным более 485 Мб.

Последний раз редактировалось Re:Flex, 08-07-2013 в 21:29.


Отправлено: 21:22, 08-07-2013 | #8


Ветеран


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

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


Цитата Re:Flex:
Пока что ~430 Мб максимальный попадался, в будущем может побольше попадаться. »
Тогда придётся перебором, наподобие приведённого выше.

Цитата Re:Flex:
Надеюсь не будет проблемы с "Не более 999 частей" с сегментами по 485 Кб и исходным более 485 Мб. »
:
Код: Выделить весь код
		intMaxPartCount = 999999999        ' Не более 999999999 частей
— устроит? Я просто не стал писать код для примерного определения потребного количества частей.
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:57, 09-07-2013 | #9


Ветеран


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

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


Цитата Iska:
Тогда придётся перебором »
Ну, вот, примерно так:
читать дальше »
Код: Выделить весь код
Option Explicit

Dim lngPartSize
Dim intMaxPartCount

Dim strSourceFile

Dim objTS

Dim strLine
Dim strContent

Dim intPartNumber
Dim strPartFileName

Dim boolPrevLineIsEmpty
Dim lngTotalWrite


If WScript.Arguments.Count = 1 Then
	With WScript.CreateObject("Scripting.FileSystemObject")
		strSourceFile = .GetAbsolutePathName(WScript.Arguments.Item(0))
		
		lngPartSize     = 500 * 2^10 ' 500Kb
		
		If .FileExists(strSourceFile) Then
			intMaxPartCount = .GetFile(strSourceFile).Size \ lngPartSize + 1
			
			strContent = ""
			boolPrevLineIsEmpty = False
			
			intPartNumber = 0
			lngTotalWrite = 0
			
			Set objTS = .OpenTextFile(strSourceFile)
			
			Do Until objTS.AtEndOfStream
				strLine = objTS.ReadLine()
				strContent = strContent & strLine & vbCrLf
				
				If Len(strContent) >= lngPartSize Then
					If Len(strLine) = 0 Then
						If boolPrevLineIsEmpty Then
							intPartNumber   = intPartNumber + 1
							strPartFileName = .BuildPath(.GetParentFolderName(strSourceFile), .GetBaseName(strSourceFile) & ".part" & Right(String(Len(CStr(intMaxPartCount)), "0") & CStr(intPartNumber), Len(CStr(intMaxPartCount))) & "." & .GetExtensionName(strSourceFile))
							
							With .CreateTextFile(strPartFileName, True)
								.Write strContent
								.Close
							End With
							
							lngTotalWrite = lngTotalWrite + Len(strContent)
							
							WScript.Echo FormatPercent(lngTotalWrite / .GetFile(strSourceFile).Size, 1) & ": Write file [" & strPartFileName & "]: " & CStr(Len(strContent)) & " b."
							
							strContent = ""
							boolPrevLineIsEmpty = False
						Else
							boolPrevLineIsEmpty = True
						End If
					End If
				End If
			Loop
			
			intPartNumber   = intPartNumber + 1
			strPartFileName = .BuildPath(.GetParentFolderName(strSourceFile), .GetBaseName(strSourceFile) & ".part" & Right(String(Len(CStr(intMaxPartCount)), "0") & CStr(intPartNumber), Len(CStr(intMaxPartCount))) & "." & .GetExtensionName(strSourceFile))
			
			With .CreateTextFile(strPartFileName, True)
				.Write strContent
				.Close
			End With
			
			lngTotalWrite = lngTotalWrite + Len(strContent)
			
			WScript.Echo FormatPercent(lngTotalWrite / .GetFile(strSourceFile).Size, 1) & ": Write file [" & strPartFileName & "]: " & CStr(Len(strContent)) & " b."
			
			objTS.Close
			
			Set objTS = Nothing
		Else
			WScript.Echo "Source file [" & strSourceFile & "] not found."
		End If
	End With
Else
	WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Source file>"
End If

WScript.Quit 0

но чудес производительности от него не ждите.
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:35, 09-07-2013 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипт для разбиения файла на части Diamond AutoIt 17 17-05-2013 01:42
Любой язык - Заменить несколько участков текстового файла на иной различный текст VARZeeK Скриптовые языки администрирования Windows 12 19-11-2012 17:37
WINS/Browse - [решено] Проблема с сетью. Разделение сети на 2 части. wowsab Сетевые технологии 2 16-03-2010 01:08
CMD/BAT - [решено] Как скопировать имя файла из текстового файла в код батника и т.д. Nun-Nun Скриптовые языки администрирования Windows 6 13-05-2009 13:28
CMD/BAT - [решено] вывод текстового файла на экран cmd idsp Скриптовые языки администрирования Windows 6 06-04-2009 07:18




 
Переход