Как вытащить текст из txt-файла
есть spt-файл (текстовый) с такой строкой внутри
[COLOR="Navy"]newdata="Выпуск N 50 (634) 4 – 10 декабря 2006 г."[/COLOR]
Нужна цифра "634" (она еженедельно увеличивается на 1... пока руками :o ), которую потом нужно запихнуть уже в Вордовский макрос в строку
[COLOR="Navy"]Path = "\\...\...\...\634\"[/COLOR] -- путь для сохранения ворд-файла.
Вот как это прописать, чтобы из внешнего файла эти три цифирки копировались бы строку макроса?
Open "C:\bla-bla-bla\bla-bl.txt" For Input As #1
Читать потихонечку, выискивая нужную строчку:
Dim s As String
While Not Eof(1)
Input #1,s
...
Wend
Файл потом закрыть:
Close #1
А полученное число 634 использовать правильным образом.
Читать потихонечку, выискивая нужную строчку:
Dim s As String
While Not Eof(1)
Input #1,s
...
Wend
Файл потом закрыть:
Close #1
А полученное число 634 использовать правильным образом.
Прошу прощения, но я профан в программировании :( . Что значит "читать потихонечку"?. Куда читать? Надо же куда-то заносить то, что я считываю?
Вот как у меня это написано языком PM Scripting:
[COLOR="Navy"]gosubfile ("c:\Program Files\Adobe\PageMaker 7.0\RSRC\USENGLSH\Plugins\Scripts\newdata.spt") >> newd [/COLOR]
--загнали строку в переменную
[COLOR="Navy"]pubnum = substr(newd, 14, 3)[/COLOR]
--вычленили из этой длинной переменной нужный кусочек с номером.
Вот надо бы аналогичную акцию воспроизвести в VB. (Как открыть файл я понял :) )
Большое спасибо за терпение.
Dim s as String, N as Long, Pos1 As Long, Pos2 As Long
Open "C:\bla-bla-bla\bla-bl.txt" For Input As #1
s=""
While Not Eof(1) And LCase(Left(s,8))<>"newdata="
Input #1,s
Wend
Close #1
If Eof(1) Then
Msgbox "Не нашла строку с newdata. :("
Exit Sub
End if
Pos1 = Instr(1, s, "(")
Pos2 = Instr(Pos1, s, ")")
N = Val(Mid(s,Pos1+1,Pos2-Pos1-1)
Msgbox N
End Sub
Здесь почти нет всяких "защит от неверных данных", если нужно и сам не сможешь - помогу.
[COLOR="Navy"]N = Val(Mid(s,Pos1+1,Pos2-Pos1-1)[/COLOR]
Потом заремил секцию, что мол, "если не нашла строку..." Во-первых этого не может быть... ;) Во-вторых, именно в этом месте заругалась, [COLOR="Navy"]"bad filename or number"[/COLOR]:confused:
Поэтому смело заремил (потом можно разобраться). И в конце получил искомую цифирку 634!
Просто сказка... Теперь попробую самостоятельно затолкать этот треклятый номер в путь для сохранения (:o )
[COLOR="Navy"]Path = "\\Solaris\uip\Ольга\634\"[/COLOR]
Б. спасибо за помощь.
[COLOR="Navy"]N = Val(Mid(s,Pos1+1,Pos2-Pos1-1)[/COLOR]
Потом заремил секцию, что мол, "если не нашла строку..." Во-первых этого не может быть... ;) Во-вторых, именно в этом месте заругалась, [COLOR="Navy"]"bad filename or number"[/COLOR]:confused:
Поэтому смело заремил (потом можно разобраться). И в конце получил искомую цифирку 634!
Просто сказка... Теперь попробую самостоятельно затолкать этот треклятый номер в путь для сохранения (:o )
[COLOR="Navy"]Path = "\\Solaris\uip\Ольга\634\"[/COLOR]
Б. спасибо за помощь.
Да, конечно. Извини, писал прямо сюда без компиляции, поэтому скобку забыл. А чтобы не ругалась на проверке (если она всё-таки нужна), должно быть так:
Dim s as String, N as Long, Pos1 As Long, Pos2 As Long
Open "C:\bla-bla-bla\bla-bl.txt" For Input As #1
s=""
While Not Eof(1) And LCase(Left(s,8))<>"newdata="
Input #1,s
Wend
Close #1
If LCase(Left(s,8))<>"newdata=" Then
Msgbox "Не нашла строку с newdata. :("
Exit Sub
End if
Pos1 = Instr(1, s, "(")
Pos2 = Instr(Pos1, s, ")")
N = Val(Mid(s,Pos1+1,Pos2-Pos1-1))
Msgbox N
End Sub
[COLOR="Navy"] Path = "\\Solaris\uip\Ольга\" & N & "\"[/COLOR]
Посмотрел через MsgBox - получилось.
Запихиваю все это в старый макрос сохранения...
Итак, он стал выглядеть сл. образом (если интересно) (что делается: у меня из программы верстки в буфер обмена копируется некоторый текст, который надо сохранять в сетевой папке для редактора со специфическим названием. (Название заголовка текста берется из названия файла верстки и присваивается номер - это я делаю языком PM Scripting). А потом нажав быстрые клавиши запускаю Ворд-макрос. Он создает пустой док, в него засовывается содержимое буфера обмена и (благодаря бесценной подсказке) сохраняется уже где надо с нужным именем.
Sub SaveUk()
Dim s As String, N As Long, Pos1 As Long, Pos2 As Long
Dim strTemp As String, Path As String, MyPath As String
Open "C:\Program Files\Adobe\PageMaker 7.0\RSRC\USENGLSH\Plugins\Scripts\Newdata.spt" For Input As #1
s = ""
While Not EOF(1) And LCase(Left(s, 8)) <> "newdata="
Input #1, s
Wend
Close #1
Pos1 = InStr(1, s, "(")
Pos2 = InStr(Pos1, s, ")")
N = Val(Mid(s, Pos1 + 1, Pos2 - Pos1 - 1))
Path = "\\Solaris\uip\Ольга\" & N & "\"
Documents.Add DocumentType:=wdNewBlankDocument
With ActiveWindow
With .View
.ShowAll = False ' отключка отображения служебных символов
End With
End With
Selection.Paste
Selection.HomeKey Unit:=wdStory
Selection.MoveDown Unit:=wdParagraph, Count:=1, Extend:=wdExtend
Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "_": .Replacement.Text = "": .Forward = True: .Wrap = wdFindStop: .Format = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
strTemp = Selection.Text
MyPath = Path + strTemp + ".doc"
ActiveDocument.SaveAs FileName:=MyPath
Documents.Close SaveChanges:=wdNoSaveChanges
Application.WindowState = wdWindowStateMinimize
End Sub
Как я догадываюсь :o у меня вообще все текста макросов и скриптов, отличаются чрезвычайной грязью (неоптимальностью). Если бы я был программистом, писал бы лаконичнее. А пока получается исключительно "в лоб". Поэтому моя нагороженная кухня работает заметно долго. Например, чистка ворд-файла ворд-макросом (для дальнейшей верстки) занимает до 20 сек. (обрабатывается примерно 40 страниц текста - ставятся теги, меняются некторые начертания, удалаются лишние пробелы и пр.).
А скрипт в PageMaker'е обрабатывает то, что пришло из Ворда еще дольше. Но все равно это быстрее, чем сучить ручонками.
А вот такой вопрос (раз уж можно. Вообще таких вопросов может родиться не мало, потому, "резервов времени", как говорится, пропасть :o ).
Я написал макру:
[COLOR="Indigo"]Sub Макрос2()
'
' Макрос записан 07.12.2006 Fil
'
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With ActiveDocument.Content.Find
.ClearFormatting
.Font.Color = wdColorDarkBlue
.Font.Size = 9
.Text = ""
With .Replacement
.Font.Bold = True
.Font.Underline = True
.Text = ""
End With
.Execute FindText:=" ", ReplaceWith:=" ", Format:=True, _
Replace:=wdReplaceAll
End With
End Sub[/COLOR]
Но меняются только пробелы. Символы (буквы, цифры и скобки остаются старыми). А почему?
Спасибо.