PDA

Показать полную графическую версию : [решено] Помогите написать скрипт удаления не нужных абзацев в тексте.


namin78
19-01-2017, 07:36
Желательно js/
Есть файл fb2. В нем есть лишние абзацы. Нужно при запуске скрипта, опросить начальную строку и конечную строку. И после нажатия "ок", удалить все между этих строк, включая эти строки.
Пример есть текст :

Обговорив с женой через интерфейс скафандров все обнаруженное мы пришли пока к решению не форсировать события и посмотреть что будет дальше. Общаться решили через интерфейс скафандра из за моей паранойи, в моем прошлом мире я слышал байки о том что сильный маг разума может подслушивать телепатическую связь на близком расстоянии, вот и решил перестраховаться. До ужина оставалось еще два часа, а потому мы решили просто полежать и отдохнуть.
Серж
Читать

Поиск

Копилка

FAQ

Почта

Глава 2
Примерно через час к нам зашел один из подчиненных Синтия и предложил переодеться в вещи достойные приема у Синтия, показав нам традиционные одежды для высшей аристократии из моего прошлого мира. Хоть я был признанным специалистом в своей области, но в связи с моим происхождением меня редко приглашали на приемы высшей аристократии. Если быть честным то только один когда помог одному графу с доставшимися в наследство древними артефактами. У нас в империи действовал закон, согласно которому все древние артефакты подлежат сдаче государству, а оно уже потом решает само что вернуть владельцу, а что оставить себе с минимальной компенсацией. Так вот граф попросил разобраться с артефактами и определить что у него там вообще есть, ведь действуя через официального оценщика артефакты почти сто процентов попали бы государству. И в благодарность за помощь граф заплатил мне пятьсот золотых и пригласил на помолвку своей дочери, хотя мне с моим торговым происхождениям там делать было нечего.



При запуске скрипта я ввожу начальную строку"Серж", конечную строку "Глава 2". Жму "ок". И на выходе получаю
Обговорив с женой через интерфейс скафандров все обнаруженное мы пришли пока к решению не форсировать события и посмотреть что будет дальше. Общаться решили через интерфейс скафандра из за моей паранойи, в моем прошлом мире я слышал байки о том что сильный маг разума может подслушивать телепатическую связь на близком расстоянии, вот и решил перестраховаться. До ужина оставалось еще два часа, а потому мы решили просто полежать и отдохнуть.

Примерно через час к нам зашел один из подчиненных Синтия и предложил переодеться в вещи достойные приема у Синтия, показав нам традиционные одежды для высшей аристократии из моего прошлого мира. Хоть я был признанным специалистом в своей области, но в связи с моим происхождением меня редко приглашали на приемы высшей аристократии. Если быть честным то только один когда помог одному графу с доставшимися в наследство древними артефактами. У нас в империи действовал закон, согласно которому все древние артефакты подлежат сдаче государству, а оно уже потом решает само что вернуть владельцу, а что оставить себе с минимальной компенсацией. Так вот граф попросил разобраться с артефактами и определить что у него там вообще есть, ведь действуя через официального оценщика артефакты почти сто процентов попали бы государству. И в благодарность за помощь граф заплатил мне пятьсот золотых и пригласил на помолвку своей дочери, хотя мне с моим торговым происхождениям там делать было нечего.


Таких кусков текста может быть несколько.

Iska
19-01-2017, 09:11
Есть файл fb2. »
Образец файла упакуйте в архив и приложите к сообщению, либо выложите архив на RGhost/Яндекс.Диск. Укажите пример строк:
начальную строку"Серж", конечную строку "Глава 2" »
для выложенного образца. Желательно также, чтобы образец содержал указанное Вами:
Таких кусков текста может быть несколько. »

namin78
19-01-2017, 09:48
Вот примерчик.http://forum.oszone.net/attachment.php?attachmentid=142780&stc=1&d=1484808471

Iska
19-01-2017, 17:22
Попробуйте так (WSH/VBScript):
Option Explicit

Dim strSourceFile
Dim strFromString, strToString

Dim objDomDocument
Dim objXMLDOMElement

Dim boolDeletion


strSourceFile = "C:\Мои проекты\0037\пример\пример.fb2"

strFromString = InputBox("From string") ' "Rinat-106 M"
strToString = InputBox("To string") ' "С нами: 3 года 2 месяца"

Set objDomDocument = WScript.CreateObject("Microsoft.XMLDOM")
objDomDocument.load(strSourceFile)

boolDeletion = False

For Each objXMLDOMElement In objDomDocument.selectNodes("/FictionBook/body/section/p")
If Not boolDeletion Then
If StrComp(objXMLDOMElement.text, strFromString, vbTextCompare) = 0 Then
objXMLDOMElement.parentNode.removeChild objXMLDOMElement
boolDeletion = True
End If
Else
objXMLDOMElement.parentNode.removeChild objXMLDOMElement

If StrComp(objXMLDOMElement.text, strToString, vbTextCompare) = 0 Then
boolDeletion = False
End If
End If
Next

objDomDocument.Save strSourceFile
Set objDomDocument = Nothing

WScript.Quit 0

namin78
19-01-2017, 21:10
Все работает. Огромное спасибо. Единственное вопрос по имени файла(пример.fb2), какой код добавить в начале в скрипт, чтобы скрипт работал с файлом, который я перетащил на него?

Разобрался сам. Огромное спасибо еще раз.

Iska
19-01-2017, 22:21
чтобы скрипт работал с файлом, который я перетащил на него? »
Примерно так (не проверялось):
Option Explicit

Dim strSourceFile
Dim strFromString, strToString

Dim objXMLDOMElement

Dim boolDeletion


If WScript.Arguments.Count = 1 Then
strSourceFile = WScript.Arguments.Item(0)

If WScript.CreateObject("Scripting.FileSystemObject").FileExists(strSourceFile) Then
strFromString = InputBox("From string") ' "Rinat-106 M"
strToString = InputBox("To string") ' "С нами: 3 года 2 месяца"

With WScript.CreateObject("Microsoft.XMLDOM")
.load(strSourceFile)

boolDeletion = False

For Each objXMLDOMElement In .selectNodes("/FictionBook/body/section/p")
If Not boolDeletion Then
If StrComp(objXMLDOMElement.text, strFromString, vbTextCompare) = 0 Then
objXMLDOMElement.parentNode.removeChild objXMLDOMElement
boolDeletion = True
End If
Else
objXMLDOMElement.parentNode.removeChild objXMLDOMElement

If StrComp(objXMLDOMElement.text, strToString, vbTextCompare) = 0 Then
boolDeletion = False
End If
End If
Next

.Save strSourceFile
End With
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 2
End If
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
WScript.Quit 1
End If

WScript.Quit 0

namin78
31-01-2017, 17:41
Iska, Вечер добрый, Вы мне недавно помогли(за что спасибо).
Есть еще одна просьба. Тот же fb2 файл, очень многие диалоги, начинаются с маленькой буквы(должны с большой).

<p>— и что же? — спросил начальник абордажной команды, здоровенный бугай, с татуировкой на всю лысую голову, с изображением взбешённого осьминога.</p>
<p>— что? А вы заметили, сколько в городе на данный момент ушастых? Кстати, все они моряки, причём военные. Нашего капитана и его помощника, окучивают на предмет покупки кораблей, только цены дают… и требуют обучить их магов для пользования движителей, причём без всякой охраной клятвы.</p>
<p>— кэп запёрся в своей вотчине и никуда носа не кажет. Поговаривают даже стычка у него была с ребятами Мика. — влез в разговор ещё один из «печальных» пиратов.</p>

Надо проверить в начале строки наличие длинного тире, если есть, то проверить какая буква идет через пробел после тире, если строчная, поменять на заглавную, если заглавная ни чего не делать.
Заранее спасибо.

Iska
11-02-2017, 17:28
какая буква идет через пробел после тире »
Там преимущественно неразрывные пробелы.

Примерно так: 143377.

Оригинал будет сохранён в одноимённый файл с расширением .bak. Если таковой уже существовал — он будет перезаписан без подтверждения.

Iska
11-02-2017, 17:46
И, похоже, это ещё не конец. Там и тире не все длинные :lol:.
<p>- Ты глянь какая громадина в косынке в таверну-то забрела?</p>

<p>- но как такое может быть?*— удивлённо взирает на безопастника император.</p>
и т.д.

Добавил уточнение в предыдущий код.

mwz
11-02-2017, 18:09
на безопастника »
Н-да, в том тексте с грамотностью вообще не всё, мягко говоря, в порядке: споткнувшись на этом пассаже, посмотрел и остальные приведённые здесь строки того текста. :(

Iska
11-02-2017, 18:13
Так. Ещё и движок форума меняет неразрывный пробел на звёздочку. Убрал код, заменил на вложение.

namin78
14-02-2017, 07:49
Спасибо.




© OSzone.net 2001-2012