Что нового

[Автоматизация] Копирование необходимых строк из документа в другой

Evochka Turkova

Новичок
Сообщения
39
Репутация
0
Доброго времени суток! Собственно, имеется документик, в котором есть заголовки и строки, Выглядит это вот так:

Код:
Заголовок номер 1
текст
текст
текст
текст
текст
текст

Заголовок номер 2
текст
текст
текст
текст
текст
текст

Подскажите на примере, как можно найти в документе и скопировать в отдельный документ, только 4 верхние строки, идущие под заголовком номер 1. Сам заголовок копировать не нужно. Также заголовков номер 1 в документе много, разбросаны по документу.

Заранее благодарю!!!
 

joiner

Модератор
Локальный модератор
Сообщения
3,432
Репутация
599
Код:
$fotest = FileOpen('test.txt');исходный файл
$fores = FileOpen('res.txt', 1);файл для записи первых четырех строк из пунктов "Заголовок 1"
While 1
	$fr = FileReadLine($fotest)
	If @error = -1 Then ExitLoop
	If $fr = 'Заголовок 1' Then
		Local $line = 1
		Do
			$fr = FileReadLine($fotest)
			FileWriteLine($fores, $fr)
			$line += 1
		Until $line = 5
	EndIf
WEnd
FileClose($fotest)
FileClose($fores)
 
Автор
E

Evochka Turkova

Новичок
Сообщения
39
Репутация
0
joiner сказал(а):
Код:
$fotest = FileOpen('test.txt');исходный файл
$fores = FileOpen('res.txt', 1);файл для записи первых четырех строк из пунктов "Заголовок 1"
While 1
	$fr = FileReadLine($fotest)
	If @error = -1 Then ExitLoop
	If $fr = 'Заголовок 1' Then
		Local $line = 1
		Do
			$fr = FileReadLine($fotest)
			FileWriteLine($fores, $fr)
			$line += 1
		Until $line = 5
	EndIf
WEnd
FileClose($fotest)
FileClose($fores)

Спасибочки!!!!!!!
И малюсенькая просьба, добавить между каждыми найденными 4 строками, одну пустую строчку.
 

joiner

Модератор
Локальный модератор
Сообщения
3,432
Репутация
599
Код:
Until $line = 5;после этой строки
		FileWriteLine($fores, '');добавить эту



Добавлено:
Сообщение автоматически объединено:

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

alex33

Скриптер
Сообщения
1,457
Репутация
186
joiner [?]
нужно учесть: данный код подразумевает, что в искомом пункте не менее 4 строк. если в файле пункт будет пустым или строк будет меньше 4, то в конечный файл попадут лишние строки

Можно так условие цикла сделать:
Код:
Until $line = 5 Or $fr = 'Заголовок 2'

и лишние строки не попадут.
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
alex33 сказал(а):
Можно так условие цикла сделать:
Код:
Until $line = 5 Or $fr = 'Заголовок 2'

и лишние строки не попадут.
Не факт. Так как в условии сказано
Evochka Turkova сказал(а):
Также заголовков номер 1 в документе много, разбросаны по документу.
 

joiner

Модератор
Локальный модератор
Сообщения
3,432
Репутация
599
в принципе можно, если в названиях пунктов есть одинаковые слова или символы, к примеру, слово "пункт"
Код:
$fotest = FileOpen('test.txt');исходный файл
$fores = FileOpen('res.txt', 1);файл для записи первых четырех строк из пунктов "Заголовок 1"
While 1
	$fr = FileReadLine($fotest)
	If @error = -1 Then ExitLoop
	If $fr = 'пункт 1' Then
		Local $line = 1
		While 1
			$fr = FileReadLine($fotest)
			If @error = -1 Then ExitLoop
			If $line = 5 Or StringInStr($fr, 'пункт') Then
				FileWriteLine($fores, '')
				ExitLoop
			Else
				If Not StringStripWS($fr, 3) = '' Then FileWriteLine($fores, $fr)
			EndIf
			$line += 1
		WEnd
	EndIf
WEnd
FileClose($fotest)
FileClose($fores)
но есть один неприятный момент, если слово "пункт" встречается в нужных для записи строках, то эти строки не будут записаны. так что, нужен символ или слово, которые встречаются только в названиях пунктов
 
Автор
E

Evochka Turkova

Новичок
Сообщения
39
Репутация
0
Код:
$fotest = FileOpen('test.txt');исходный файл
$fores = FileOpen('res.txt', 1);файл для записи первых четырех строк из пунктов "Заголовок 1"
While 1
    $fr = FileReadLine($fotest)
    If @error = -1 Then ExitLoop
    If $fr = 'Заголовок 1' Then
        Local $line = 1
        Do
            $fr = FileReadLine($fotest)
            FileWriteLine($fores, $fr)
            $line += 1
        Until $line = 5
    EndIf
WEnd
FileClose($fotest)
FileClose($fores)


Почему-то ничего не копирует, если в заголовке присутствует знак :. Т.е если заголовок написан к примеру - Заголовок: 1. :'(
 

joiner

Модератор
Локальный модератор
Сообщения
3,432
Репутация
599
получается, что в документе может быть написано Заголовок 1 и Заголовок: 1 ?
если только Заголовок: 1 то измени
Код:
If $fr = 'Заголовок 1' Then

на
Код:
If $fr = 'Заголовок: 1' Then

или, с учетом обоих вариантов
Код:
If $fr = 'Заголовок 1' Or $fr = 'Заголовок: 1' Then
 
Автор
E

Evochka Turkova

Новичок
Сообщения
39
Репутация
0
joiner в том то и дело, что ничего не копируется, если присутствует двоеточие в названии заголовка.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
А если через регулярное вырожение?
Код:
If StringRegExp($fr,'(?si)Заголовок[^\d]+1') Then
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
Evochka Turkova, будет проще, если вы укажите какие заголовки присутствуют. Желаетельно прямо скопировать их сюда. Потому как отличие может быть не только в ":", но и в пробелах.
alex33, по моему, ваш паттерн надо добавить [^\d] после "1". Иначе под него попадут и 10..19 и 100..199 и т.д.
 
Автор
E

Evochka Turkova

Новичок
Сообщения
39
Репутация
0
edyapdalex33 не получается :stars:

Попробуйте на примере

Код:
Заголовок: 1
 

joiner

Модератор
Локальный модератор
Сообщения
3,432
Репутация
599
Evochka Turkova
у меня все работает.
сам текстовый документ
Код:
Заголовок: 1
1-1
1-2
1-3
1-4
1-5
1-6
Заголовок: 2
1
2
3
4
5
6
Заголовок 1
2-1
2-2
2-3
2-4
2-5
2-6
Заголовок: 6
2-1
2-2
2-3
2-4
2-5
2-6
Заголовок: 1
3-1
3-2
3-3
3-4
3-5
3-6
код для него. в коде условие, что может быть Заголовок 1 и Заголовок: 1
Код:
$fotest = FileOpen('test.txt');исходный файл
$fores = FileOpen('res.txt', 1);файл для записи первых четырех строк из пунктов "Заголовок 1"
While 1
    $fr = FileReadLine($fotest)
    If @error = -1 Then ExitLoop
    If $fr = 'Заголовок 1' Or $fr = 'Заголовок: 1' Then
        Local $line = 1
        While 1
            $fr = FileReadLine($fotest)
            If @error = -1 Then ExitLoop
            If $line = 5 Or StringInStr($fr, 'Заголовок') Then
                FileWriteLine($fores, '')
                ExitLoop
            Else
                If Not StringStripWS($fr, 3) = '' Then FileWriteLine($fores, $fr)
            EndIf
            $line += 1
        WEnd
    EndIf
WEnd
FileClose($fotest)
FileClose($fores)
выше было правильно написано, что в строке Заголовок: 1 может быть разное количество пробелов
а может без пробела. повторюсь, у меня все работает
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
joiner, у неё ещё после "1" пробел, по этому строки и не равны.
Evochka Turkova, попробуйте в скрипте который написал вам joiner, заменить строку
Код:
If $fr = 'Заголовок 1' Or $fr = 'Заголовок: 1' Then

на
Код:
If StringRegExp($fr,'(?si)Заголовок[^\d]*?1[^\d]*$') Then
 

prokazzza

Новичок
Сообщения
160
Репутация
2
joiner сказал(а):
Код:
$fotest = FileOpen('test.txt');исходный файл
$fores = FileOpen('res.txt', 1);файл для записи первых четырех строк из пунктов "Заголовок 1"
While 1
	$fr = FileReadLine($fotest)
	If @error = -1 Then ExitLoop
	If $fr = 'Заголовок 1' Then
		Local $line = 1
		Do
			$fr = FileReadLine($fotest)
			FileWriteLine($fores, $fr)
			$line += 1
		Until $line = 5
	EndIf
WEnd
FileClose($fotest)
FileClose($fores)

Вопрос знатокам, в теме обсуждалось что в документе строго 6 строк, а что если количество строк под заголовком рандомное? 1 или 48, ведь:

Код:
Until $line = 5


уже будет неактуально.

??
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
244
Всё зависит от Вашей конкретной задачи . По какому-то признаку Вы ведь определяете, что начался другой заголовок, вот и ищите этот признак. Лучше - создайте свою тему, приведите пример документа , желаемый результат и вам обязательно помогут !
 
Верх