Чтение файла

Программирование на Visual Basic for Applications
batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Чтение файла

Сообщение batiq » 05.07.2005 (Вт) 17:54

файл содержит текст-таблицу, состоящий из определенных последовательностей символов.. т.е. я знаю сколько симфолов принадлежат полю "фамилия", "имя", "отчество" и т.д.

как прочесть подобный файл?.

пробую так, не получается:

Dim RecordName As String * 2
Dim TlcoCon As String * 4
Dim ExchangeID As String * 11
Dim SystemName As String * 4
Dim MeasurementName As String * 8
Dim JobNum As String * 8
Dim VersionN As String * 4
Dim BeginDate As String * 8
Dim EndDate As String * 8

Sub ReadTGRP()
Dim FileNum As Integer
Dim txt As String
Dim i As Integer
FileNum = FreeFile
i = 0
fileToOpen = Application.GetOpenFileName("Text Files (*.txt), *.txt")
If fileToOpen <> False Then
Open fileToOpen For Input As FileNum
Worksheets("Ëèñò1").Activate
Cells.Select
Cells.Clear
Input #FileNum, RecordName, TlcoCon, ExchangeID, _
SystemName, MeasurementName, JobNum, VersionN, _
BeginDate, EndDate
Do Until EOF(FileNum)
Line Input #FileNum, txt
Worksheets("Ëèñò1").Activate
i = i + 1
Range("A" + CStr(i)).Select
ActiveCell = txt
Loop
Close #FileNum
End If
End Sub

Почему, после чтения программой каждой строки определенного размера происходит перевод коретки?.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 06.07.2005 (Ср) 3:17

Потому что, наверное, понятие User Defined Types нам не знакомо?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 06.07.2005 (Ср) 10:32

GSerg писал(а):Потому что, наверное, понятие User Defined Types нам не знакомо?

Ты имеешь ввиду то, что я декларировал переменные до объявления sub-процедуры?.
я попробую перенести внутрь..

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 06.07.2005 (Ср) 10:33

Нет, он имеет в виду, что надо определить пользовательский тип, идентичный по структуре и размеру порции данных в файле, и потом читать файл как типизированный. Вот.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 06.07.2005 (Ср) 11:34

Строки в файле содержат разные поля, которые не разделены ни чем, а идут последовательно слитно..
1. Размеры полей мне известны..
2. Известны первые три строки..
3. Остальные строки имеют такие же поля как в третьей..

Будет ли проблемой создавать типизированный файл в моем случае?.

Текст файла следующий (тут третья строка начинается с 05-02-1000:00; она не помещается - происходит перенос строк):

VS0000AD075L7055EEWSDACTADPHM00009340A0 505-02-1005-02-10
93402829A0 5 601D900 05-02-1000-00-0000-00-0000-00-0005-02-1000-00-00-0000-00-00-0000-00-00-0000-00-00-00000000TS.ADPH.TH1
05-02-1000:00 652BPSTNMBW19 124072 3761 0 911 0 0 123 0 131680 2BBSC1 BW20 1451640 41528 0 10298 0 0 464 0 1418953 2BBEEL BW20 236388 5237 0 1598 0 0 123 0 235948 2BASSA BW18 44080 1583 0 1562 0 0 60 0 45429 2BTRANSBW20 107304 2345 0 466 0 0 61 0 96680 2BPSTNGBW11 212152 4848 0 2218 0 0 93 0 211715 2BMEG BW20 1281224 34483 8 8676 15 0 402 0 1263062 2MICINCIC18 499608 13386 4316 240 0 508480 2MICOUTOG18 501344 13406 0 4458 0 0 240 0 510366 2BBSC2 BW19 356268 9198 0 3153 0 0 232 0 337344 2BHUAW BW18 14652 404 0 102 0 0 60 0 19033 2B69 BW20 60392 1319 0 372 0 0 61 1 52627 2BBSC3 BW20 1330736 25786 0 10728 0 0 464 0 1337406 2BSGVP1BW20 480408133861 0 3339 0 0 217 0 373114 2BSGVP2BW20 452228 15257 0 3326 0 0 217 0 353271 2BSIGV BW14 104 39 0 0 0 0 31 28 63 2BHUA1 BW18 52608 1204 0 555 0 0 119 0 50612

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 06.07.2005 (Ср) 11:37

batiq писал(а):VS0000AD075L7055EEWSDACTADPHM00009340A0 505-02-1005-02-10

для этой строки я объявлял строки определенной длины

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 29.07.2005 (Пт) 14:39

Подскажите, пожалуйста.. с чего мне следует начать..

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 29.07.2005 (Пт) 14:44

Код: Выделить всё
Private Type DATA_STRUCTURE
    RecordName As String * 2
    TlcoCon As String * 4
    ExchangeID As String * 11
    SystemName As String * 4
    MeasurementName As String * 8
    JobNum As String * 8
    VersionN As String * 4
    BeginDate As String * 8
    EndDate As String * 8
End Type

Dim mtVar4Read As DATA_STRUCTURE

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 11.08.2005 (Чт) 13:05

Sedge писал(а):
Код: Выделить всё
..
Dim mtVar4Read As DATA_STRUCTURE

а почему так назвал?: mtVar4Read
что значит?: mt

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 11.08.2005 (Чт) 13:10

У меня ничего не выходит: Run-time error '62': Input past end of file.
Мой
Код: Выделить всё
Private Type DATA_STRUCTURE
    RecordName As String * 2
    TlcoCon As String * 4
    ExchangeID As String * 11
    SystemName As String * 4
    MeasurementName As String * 8
    JobNum As String * 8
    VersionN As String * 4
    BeginDate As String * 8
    EndDate As String * 8
End Type

Sub ReadTGRP()

Dim mtVar4Read As DATA_STRUCTURE
   
    Dim FileNum As Integer
    Dim txt As String
    Dim i As Integer
    FileNum = FreeFile
    i = 0
    fileToOpen = Application.GetOpenFileName("Text Files (*.txt), *.txt")
    If fileToOpen <> False Then
        Open fileToOpen For Input As FileNum
        Worksheets("Ëèñò1").Activate
        Cells.Select
        Cells.Clear
        Input #FileNum, mtVar4Read.RecordName, mtVar4Read.TlcoCon, mtVar4Read.ExchangeID, _
            mtVar4Read.SystemName, mtVar4Read.MeasurementName, mtVar4Read.JobNum, _
            mtVar4Read.VersionN, mtVar4Read.BeginDate, mtVar4Read.EndDate
        Do Until EOF(FileNum)
            Line Input #FileNum, txt
            Worksheets("Ëèñò1").Activate
            i = i + 1
            Range("A" + CStr(i)).Select
            ActiveCell = txt
        Loop
        Close #FileNum
    End If
End Sub

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.08.2005 (Чт) 13:14

Open For Random As ... Len = Len(mtVar4Read)
Input #FileNum, mtVar4Read
Lasciate ogni speranza, voi ch'entrate.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 11.08.2005 (Чт) 13:40

alibek писал(а):Open For Random As ... Len = Len(mtVar4Read)
Input #FileNum, mtVar4Read

Объясни как это все работает.. Пожалуйста..

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.08.2005 (Чт) 13:42

Ты открываешь файл не для последовательного ввода/вывода (input/output), а для произвольного доступа (random). И указываешь длину записи. Ее можно указать цифрами, посчитав число байт, занимаемых одной записью, а можно использовать Len(var) (или LenB(var)), которая вернет длину переменной.
Во втором случае ты просто считываешь эту переменную. Только я неправильно указал, для считывания/записи надо использовать Get/Put.
Lasciate ogni speranza, voi ch'entrate.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 11.08.2005 (Чт) 14:04

alibek писал(а):Ты открываешь файл не для последовательного ввода/вывода..

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

Будут ли проблемы?.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.08.2005 (Чт) 14:08

Конечно. Random применим только к файлам с однородной структурой.
Открывай, как Binary и пиши свой обработчик или класс.
Lasciate ogni speranza, voi ch'entrate.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 11.08.2005 (Чт) 14:10

alibek писал(а):Открывай, как Binary и пиши свой обработчик или класс.

Я в этом деле новичек.. Ты мне подскажешь с чего начинать и что необходимо?.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.08.2005 (Чт) 14:15

Для начала, выложи тут фрагмент этого файла. Только отдели разные записи и поля (лучше всего цветом).
Lasciate ogni speranza, voi ch'entrate.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 11.08.2005 (Чт) 14:57

Я примерно отметил по цветам (четвертая и следующие такие же как третья)..
первая строка
VS0000AD075L7055EEWSDRECTGRP 00002529G03905-02-1005-02-10
вторая строка
2529 291G039 151D900 05-02-1000-00-0000-00-0000-00-0005-02-1000-00-00-0000-00-00-0000-00-00-0000-00-00-00000000TS.TGRP.TH1
третья строка
05-02-1000:151 721BLIND B1 0 0 0 0 0 0 0 0 2BLIND B1 0 0 0 0 0 0 0 0 03BLIND B1 0 0 0 0 0 0 0 0 04BLIND B1 0 0 0 0 0 0 0 5BLIND B1 0 0 0 0 0 0 1BBSC1 B1 1845 148412 375 126560 404 49864 207 47385 2BBSC1 B1 464 0 0 0 0 0 0 0 03BBSC1 B1 34 0 0 2 0 36 1 5 1024BBSC1 B1 0 0 0 0 0 0 0 5BBSC1 B1 0 0 22 0 0 0 1BPSTNMB1 55 3492 21 2621 125 4572 34 3500 2BPSTNMB1 123 0 0 0 0 0 0 0 03BPSTNMB1 4 0 0 13 0 30 0 8 284BPSTNMB1 0 0 0 0 0 0 0 5BPSTNMB1 0 0 9 0 0 0 1BASSA B1 0 0 0 0 95 2052 93 2029 2BASSA B1 60 0 0 0 0 0 0 0 03BASSA B1 0 1 0 0 0 0 0 0 04BASSA B1 0 0 0 0 0 0 0 5BASSA B1 0 0 0 0 0 0 1BTRANSB1 53 3232 14 3112 34 5252 10 5821 2BTRANSB1 61 0 0 0 0 0 0 0 03BTRANSB1 0 0 0 0 0 2 0 0 204BTRANSB1 0 0 0 0 0 0 0 5BTRANSB1 0 0 1 0 0 0
Последний раз редактировалось batiq 11.08.2005 (Чт) 15:09, всего редактировалось 3 раз(а).

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.08.2005 (Чт) 15:05

Мда... Какие у тебя поля есть в первой строке, во второй и в остальных? И каким цветам они соответствуют?
Lasciate ogni speranza, voi ch'entrate.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 11.08.2005 (Чт) 15:21

в первой строке как объявленно в программе в том же порядке, остальные пусть будут a,b,c и т.д.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.08.2005 (Чт) 15:27

Код: Выделить всё
Function ReadData(ByVal File As String, ByVal LineNumber As Long, ByRef Arguments() As String) As Boolean
Dim FN As Integer, C As Long, L As String
FN = FreeFile()
Open File For Input As #FN
Do While Not EOF(FN)
  Line Input #FN, L
  C = C + 1
  If C = LineNumber Then
    Select Case C
      Case 1
        Call Process1Line(L, Arguments)
      Case 2
        Call Process2Line(L, Arguments)
      Case Else
        Call ProcessRestLine(L, Arguments)
    End Select
    Exit Function
  End If
Loop
Close #FN
End Function

Sub Process1Line(ByVal LineString As String, Args() As String)
'         1         2         3         4         5
'123456789012345678901234567890123456789012345678901234567
'* *   *          *   *       *       *   *       *       
'VS0000AD075L7055EEWSDRECTGRP 00002529G03905-02-1005-02-10
'
Dim I As Long
ReDim Args(1 To 9)
Args(1) = Mid$(LineString, 1, 2)
Args(2) = Mid$(LineString, 3, 4)
Args(3) = Mid$(LineString, 7, 11)
Args(4) = Mid$(LineString, 18, 4)
Args(5) = Mid$(LineString, 22, 8)
Args(6) = Mid$(LineString, 30, 8)
Args(7) = Mid$(LineString, 38, 4)
Args(8) = Mid$(LineString, 42, 8)
Args(9) = Mid$(LineString, 50, 8)
End Sub

Sub Process2Line(ByVal LineString As String, Args() As String)
'         1         2         3         4         5         6         7         8         9        10        11        12
'1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901
'*   *  * *  * **    *       *                       *                                                         *         
2529 291G039 151D900 05-02-1000-00-0000-00-0000-00-0005-02-1000-00-00-0000-00-00-0000-00-00-0000-00-00-00000000TS.TGRP.TH1
'
Dim I As Long
ReDim Args(1 To 11)
Args(1) = Mid$(LineString, 1, 4)
Args(2) = Mid$(LineString, 5, 3)
Args(3) = Mid$(LineString, 8, 2)
Args(4) = Mid$(LineString, 10, 3)
Args(5) = Mid$(LineString, 13, 2)
Args(6) = Mid$(LineString, 15, 1)
Args(7) = Mid$(LineString, 16, 5)
Args(8) = Mid$(LineString, 21, 8)
Args(9) = Mid$(LineString, 29, 24)
Args(10) = Mid$(LineString, 53, 58)
Args(11) = Mid$(LineString, 111, 11)
End Sub

Sub ProcessRestLine(ByVal LineString As String, Args() As String)
' Здесь будет код, аналогичный предыдущим двум, только позиции столбцов другие.
End Sub
Lasciate ogni speranza, voi ch'entrate.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 11.08.2005 (Чт) 16:03

поясни, пожалуйста работу ReadData :wink:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.08.2005 (Чт) 16:06

А что там пояснять?
Код: Выделить всё
Dim A() As String
If ReadData("c:\file1", 4, A()) Then
  ' строка найдена, параметры в массиве A()
End If
Lasciate ogni speranza, voi ch'entrate.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 11.08.2005 (Чт) 16:08

а что значит Dim A() As String ?.
а 4 количество символов?.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.08.2005 (Пт) 7:45

4 - это какую строку надо считать.
A() - это массив, в него будут возвращены аргументы (параметры).

Ты вообще код читал?
Lasciate ogni speranza, voi ch'entrate.

batiq
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 21.01.2005 (Пт) 13:47

Сообщение batiq » 12.08.2005 (Пт) 9:31

Ура-аа!.
Спасибо, огромущее.. Теперь я знаю массивы (чуть-чуть)..


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 56

    TopList