Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как вытащить текст из txt-файла

248
07 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Вот примитивная задачка.
есть spt-файл (текстовый) с такой строкой внутри

[COLOR="Navy"]newdata="Выпуск N 50 (634) 4 – 10 декабря 2006 г."[/COLOR]


Нужна цифра "634" (она еженедельно увеличивается на 1... пока руками :o ), которую потом нужно запихнуть уже в Вордовский макрос в строку

[COLOR="Navy"]Path = "\\...\...\...\634\"[/COLOR] -- путь для сохранения ворд-файла.

Вот как это прописать, чтобы из внешнего файла эти три цифирки копировались бы строку макроса?
267
07 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Открыть:
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 использовать правильным образом.
248
07 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Цитата: Cutty Sark
Открыть:

Читать потихонечку, выискивая нужную строчку:
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. (Как открыть файл я понял :) )

Большое спасибо за терпение.

267
07 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Ну давай попробуем.
Код:
Sub MyProgram
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


Здесь почти нет всяких "защит от неверных данных", если нужно и сам не сможешь - помогу.
248
07 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Спасибоооо.... Начнем испытывать ;)
248
07 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Так. Сначала добавил недостающую закрывающую скобочку в строчку
[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]

Б. спасибо за помощь.
267
07 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Цитата: Dmitry2064
Так. Сначала добавил недостающую закрывающую скобочку в строчку
[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]

Б. спасибо за помощь.



Да, конечно. Извини, писал прямо сюда без компиляции, поэтому скобку забыл. А чтобы не ругалась на проверке (если она всё-таки нужна), должно быть так:

Код:
Sub MyProgram
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
248
07 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Итак, получилось следующее:
[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
267
07 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
В принципе, его можно немного улучшить, но не принципиально. Так что удачи и если что - обращайся.
248
07 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Цитата: Cutty Sark
В принципе, его можно немного улучшить, но не принципиально. Так что удачи и если что - обращайся.



Как я догадываюсь :o у меня вообще все текста макросов и скриптов, отличаются чрезвычайной грязью (неоптимальностью). Если бы я был программистом, писал бы лаконичнее. А пока получается исключительно "в лоб". Поэтому моя нагороженная кухня работает заметно долго. Например, чистка ворд-файла ворд-макросом (для дальнейшей верстки) занимает до 20 сек. (обрабатывается примерно 40 страниц текста - ставятся теги, меняются некторые начертания, удалаются лишние пробелы и пр.).

А скрипт в PageMaker'е обрабатывает то, что пришло из Ворда еще дольше. Но все равно это быстрее, чем сучить ручонками.

А вот такой вопрос (раз уж можно. Вообще таких вопросов может родиться не мало, потому, "резервов времени", как говорится, пропасть :o ).

248
07 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
В ворде есть текст, оформленный синим цветом и размером в 9 пт. (т.е. мелкий и синий). К этим характеристикам надо добавить еще полужирное начертание и подчеркивание.
Я написал макру:

[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]

Но меняются только пробелы. Символы (буквы, цифры и скобки остаются старыми). А почему?

Спасибо.
267
07 декабря 2006 года
Cutty Sark
1.2K / / 17.10.2002
Неужели не заметил? Я перенёс твой вопрос (первую попытку его отправить) вот сюда:
http://forum.codenet.ru/showthread.php?t=32630
248
07 декабря 2006 года
Dmitry2064
590 / / 06.12.2006
Ага, а я подумал, что вопрос пропал (не отправился). И поэтому повторил... Виноват. Буду внимательнее.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог