Страница 1 из 1

Работа с txt файлом. Как получить строку?

Добавлено: 08 апр 2009, 11:58
RomaS
Добрый день!
подскажите по такому вопросу:
Некая программа выдает тхт файл с таким содержимым:

[HTML] %CLIENT
NAME Иванов Иван Иванович
F_TABNUM :100025
REC_SUM :6072.00
%END
%CLIENT
NAME Фамилия Имя Отчество
F_TABNUM :100047
REC_SUM :5008.84
%END
%CLIENT
........ [/HTML]

причем текст в dos кодировке.

ну, кодировать то можно с помощью известного примера:

Код: Выделить всё

 Private Declare Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long 'конвертируем строку в win-кодировку.
Function dosToWin(sourstr$) As String
dosToWin = Space$(Len(sourstr))
OemToChar sourstr, dosToWin
End Function 
А вот как получить собственно ФИО и сумму? Ну и полученные данные вставить в лист эксель
--------------------------------------------------------------------------------
Добавленное сообщение
--------------------------------------------------------------------------------
Сейчас вот подумал...
А если открыть этот файл в экселе, то строки становятся ячейками - для меня это гораздо ближе) Но теперь как брать данные? Искать ячейку, начинающуюся с "NAME" или "REC_SUM" и брать текст после ":" или пробелов видимо?

Re: Работа с txt файлом. Как получить строку?

Добавлено: 08 апр 2009, 14:23
Naeel Maqsudov
Меню Данные/Текст по столбцам...

Re: Работа с txt файлом. Как получить строку?

Добавлено: 08 апр 2009, 15:28
RomaS
ага! вот что записалось при такой операции:

Код: Выделить всё

 Sub Ìàêðîñ1()

    Range("A2").Select
    Selection.TextToColumns Destination:=Range("A2"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
        :=":", FieldInfo:=Array(Array(1, 2), Array(2, 1)), DecimalSeparator:=".", _
        TrailingMinusNumbers:=True
    Range("B2").Select
End Sub 


Некрасиво, конечно, но уже можно попробовать автоматизировать... А как сделать поиск по маске? ну например, ячейку начинающуюся с NAME * или тоже можно записать?! Сейчас попробую...
--------------------------------------------------------------------------------
Добавленное сообщение
--------------------------------------------------------------------------------
да, и это записалось)

Код: Выделить всё

  Range("A1").Select
    Cells.Find(What:="NAME", After:=ActiveCell, LookIn:=xlValues, LookAt:= _
        xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:= _
        False, SearchFormat:=False).Activate
    Range("E3").Select
но все-же жду решения по-симпатичней)

Re: Работа с txt файлом. Как получить строку?

Добавлено: 08 апр 2009, 15:39
Naeel Maqsudov
Не надо записывать макрос.
Надо просто воспользоваться готовой функциональностью.
Выделите весь столбец, потом разделите на столбцы по пробелам и двоеточиям. Потом удалите лишние столбцы и строки. Останутся фамилии с суммами.

Re: Работа с txt файлом. Как получить строку?

Добавлено: 08 апр 2009, 15:42
RomaS
Просто, это надо делать автоматически... в дальнейшем обработанные данные вставляются в текст реестра, распечатываются, пересохраняются в DBF4 и скармливаются следующей программе...

Re: Работа с txt файлом. Как получить строку?

Добавлено: 08 апр 2009, 17:47
Naeel Maqsudov
Тогда быстрее всего так:

Код: Выделить всё

Sub import()
   fn = FreeFile
   Open "c:/file.txt" For Input As #fn
   i = 0
   While Not EOF(fn)
     Input #fn, s
     Select Case Trim(Left(s, 10))
       Case "%CLIENT"
         tn = Null
         fio = ""
         sm = Null
       Case "%END"
         i = i + 1
         Cells(i, 1).Range("A1:C1").Value = Array(tn, fio, sm)
       Case "NAME"
         fio = Trim(Mid(s, 5, 999))
       Case "F_TABNUM"
         tn = CLng(Trim(Mid(s, 12, 999)))
       Case "REC_SUM"
         sm = Val(Trim(Mid(s, 12, 999)))
     End Select
   Wend
End Sub

Re: Работа с txt файлом. Как получить строку?

Добавлено: 09 апр 2009, 07:21
RomaS
То что надо! Огромное Спасибо! ) Правда, еще перед фио ставилось двоеточие, но убрал его так:
......
Dos_Text = Replace(fio, ":", "") ' убираем двоеточия из фио
Call dosToWin(Win_Text, Dos_Text) ' конвертируем
......
Делаю дальше - добавление еще одной колонки с лиц счетом из другого файла, но это вроде уже не сложно...
--------------------------------------------------------------------------------
Добавленное сообщение
--------------------------------------------------------------------------------
что-то я опять не туда залез)
двоеточие проще убрать исправив одну цифру так:
fio = Trim(Mid(s, 12, 999))