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

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

Ответить
Настройки темы
Любой язык - [решено] Извлечь определенные строки по счету из одного тхт файла в другой

Ветеран


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

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


Здравствуйте, подскажите, пожалуйста как можно из одного тхт файла скопировать 1, 5, 9, 13... и т.д. строчки (+4), из одного тхт файла в другой? Притом по 2 копии каждой строчки.

пример тхт файла:

Код: Выделить весь код
строка1
строка2
строка3
строка4
строка5
строка6
строка7
строка8
строка9
строка10
строка11
выводимый тхт файл после применения скрипта:

Код: Выделить весь код
строка1
строка1
строка5
строка5
строка9
строка9

Отправлено: 21:56, 10-06-2015

 

Ветеран


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

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


Кодировка «одного тхт файла» какая?

Попробуйте так:
Скрытый текст
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=%~1
set sDestFile=Result.txt

if defined sSourceFile (
	if exist "%sSourceFile%" (
		for /f "usebackq delims=" %%i in (
			`type "%sSourceFile%" ^| find.exe /c /v ""`
		) do set /a iLinesCount = %%~i
		
		set /a iCycles = !iLinesCount! / 3
		set /a iMod = !iLinesCount! %% 3
		
		if !iMod! neq 0 set /a iCycles += 1
		
		<"%sSourceFile%" >"%sDestFile%" (
			for /l %%i in (1, 1, !iCycles!) do (
				set sLine1=
				set sLine2=
				set sLine3=
				
				>nul set /p sLine1=
				>nul set /p sLine2=
				>nul set /p sLine3=
				
				echo.!sLine1!
				echo.!sLine1!
			)
		)
	) else (
		echo Can't find source file [%sSourceFile%].
		exit /b 2
	)
) else (
	echo Usage: %~nx0 ^<Source file^>
	exit /b 1
)

endlocal
exit /b 0

Исходный файл указывается параметром пакетного файла (также можно перетащить исходный файл на пакетный файл в Проводнике). Имя результирующего файла тупо указано в коде («Result.txt»).
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:05, 10-06-2015 | #2



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

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


Ветеран


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

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


спасибо, работает. Я не много исправил, добавил еще

set sLine4=

и

>nul set /p sLine4=

т.к. нужно извлекать 1, 5, 9, 13 ......... т.е. между извлеченными строками всегда 3 других строчки.

Только вот почему - то в результирующий файл, в конце добавляются лишние пустые строки, может я не до конца исправил (или вообще не правильно)?

Отправлено: 23:32, 10-06-2015 | #3


Ветеран


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

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


Цитата Alexander_88:
Я не много исправил, добавил еще
set sLine4=
и
>nul set /p sLine4=
т.к. нужно извлекать 1, 5, 9, 13 ......... т.е. между извлеченными строками всегда 3 других строчки. »
Мда, это у меня уже маразм, не иначе. Попробуйте так:
Скрытый текст
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=%~1
set sDestFile=Result.txt

if defined sSourceFile (
	if exist "%sSourceFile%" (
		for /f "usebackq delims=" %%i in (
			`type "%sSourceFile%" ^| find.exe /c /v ""`
		) do set /a iLinesCount = %%~i
		
		set /a iCycles = !iLinesCount! / 4
		set /a iMod = !iLinesCount! %% 4
		
		if !iMod! neq 0 set /a iCycles += 1
		
		<"%sSourceFile%" >"%sDestFile%" (
			for /l %%i in (1, 1, !iCycles!) do (
				set sLine1=
				set sLine2=
				set sLine3=
				set sLine4=
				
				>nul set /p sLine1=
				>nul set /p sLine2=
				>nul set /p sLine3=
				>nul set /p sLine4=
				
				echo.!sLine1!
				echo.!sLine1!
			)
		)
	) else (
		echo Can't find source file [%sSourceFile%].
		exit /b 2
	)
) else (
	echo Usage: %~nx0 ^<Source file^>
	exit /b 1
)

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

Отправлено: 00:48, 11-06-2015 | #4


Ветеран


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

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


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

Отправлено: 00:54, 11-06-2015 | #5


Забанен


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

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


Пример однострочника (PS):
Код: Выделить весь код
gc file|%{[Regex]$r='\d+\Z'}{if($r.Match($_).Value%4 -eq 1){"$($_)`n$_"}}
Итог:
Код: Выделить весь код
строка1
строка1
строка5
строка5
строка9
строка9

Отправлено: 20:12, 11-06-2015 | #6


Ветеран


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

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


Цитата greg zakharov:
Пример однострочника (PS): »
Навряд ли оригинальный файл имеет именно такое содержимое.


Update: На PowerShell как-то так:
Код: Выделить весь код
$sContent = Get-Content "C:\Мои проекты\10\0001.txt"

for($i = 0; $i -le $sContent.count; $i += 4) {
    $sContent[$i], $sContent[$i]
}

P.S. На PowerShell нельзя, как в C, использовать несколько операторов в строке инициализации цикла:
Код: Выделить весь код
for($i = 0, $sContent = Get-Content "C:\Мои проекты\10\0001.txt"; $i -le $sContent.count; $i += 4) {
    …
?

Последний раз редактировалось Iska, 11-06-2015 в 20:54.


Отправлено: 20:40, 11-06-2015 | #7


Забанен


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

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


Цитата Iska:
Навряд ли оригинальный файл имеет именно такое содержимое.
Дык никто на почку не закладывается: каков пример файла - таков ответ. Да и разницы нет черз for ли или foreach перебирать строки.
Цитата Iska:
...нельзя...?
Это же, как Вы сами сказали, не Си и не JavaScript.

Отправлено: 21:07, 11-06-2015 | #8


Ветеран


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

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


Пример он и есть пример — не более, а поскольку выше было явно сказано:
Цитата Alexander_88:
скопировать 1, 5, 9, 13... и т.д. строчки (+4) »
— т.е., никаких ссылок на то, что будут а) числа, б) в конце строк, в) расположенные с единицы в порядке строгого возрастания — то и ориентироваться следует сугубо на порядковый номер строки.

Цитата greg zakharov:
Это же, как Вы сами сказали, не Си и не JavaScript. »
Я не знаю, потому и спрашиваю. Мало ли.

Отправлено: 21:56, 11-06-2015 | #9


Забанен


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

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


Цитата Iska:
...никаких ссылок на то, что будут...
От перестановки мест слогаемых сумма не меняется.
Код: Выделить весь код
1..($c=gc foo).length|%{if($_%4 -eq 1){$l=$c[$_-1];"$l`n$l"}}
Цитата Iska:
Я не знаю, потому и спрашиваю. Мало ли.
Чтобы понять принцип работы for'а и парсера PS вцелом, могу лишь посоветовать поковыряться в сборках последнего ILDASM'ом, например.

Отправлено: 06:55, 12-06-2015 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] извлечение ссылок из одного тхт файла в другой Alexander_88 Скриптовые языки администрирования Windows 4 05-04-2015 15:39
C/C++ - С :запись из одного файла в другой только часть строки alfaw Программирование и базы данных 1 07-07-2013 23:40
CMD/BAT - Перенос строк из одного файла в другой jackscorpse Скриптовые языки администрирования Windows 0 25-08-2012 00:31
Любой язык - [решено] из одного тхт файла добавить содержимое во все тхт файлы папки gangsterovich Скриптовые языки администрирования Windows 3 06-05-2011 04:29
Как экспортировать поле из одного dbf файла в другой? Raman Программное обеспечение Windows 1 04-04-2008 14:30




 
Переход