powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Текстовый файл и поиск
12 сообщений из 12, страница 1 из 1
Текстовый файл и поиск
    #36616168
DUDALS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется текстовый файл с выгруженной базой:
где [] начало и конец названия таблицы
<< >> начало и конец записи в таблице
| Разделитель данных
Например:
[TypeStr]
<<УЛИЦА>>
<<ПЕРЕУЛОК>>
<<ПРОЕЗД>>
[NameStr]
<<ПИРОГОВА>>
<<ВАНЕЕВА>>
<<ИЛИМСКАЯ>>
[INFO]
<<ПЕТРОВ|ИВАН|ИВАНОВИЧ|3527|1|0>>
<<ПЕТРОВ|ИВАН|ИВАНОВИЧ|||>>
<<СВЕРИДОВ|ВИНИАМИН|ПЕТРОВИЧ||0|1>>

Ломаю голову второй день.
Как построчно прочитать данные от одного [] до второго []?
и "разобратьть" строку с | между данными.
Подскажите пожалуйста идею. (открывать файл, считывать строку от начала файда до конца получается, а дальше....
...
Рейтинг: 0 / 0
Текстовый файл и поиск
    #36616181
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InStr - искать квадратные скобки.

DUDALSоткрывать файл, считывать строку от начала файда до конца получается, а дальше....

Вот это непонятно. У вас в файле нет концов строки? То есть вы не можете построчно читать файл, только целиком?
...
Рейтинг: 0 / 0
Текстовый файл и поиск
    #36616188
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DUDALSи "разобратьть" строку с | между данными.

Split - разобрать строку по указанному разделителю.
...
Рейтинг: 0 / 0
Текстовый файл и поиск
    #36616552
cynep kopoBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
считываете, я полагаю, с помощью LINE INPUT?

Для удобства напишите процедуру, которая, получая строку и 1 параметр (тип ограничителя раздела) будет возвращать только текст (как раз с помощью INSTR)
Как я увидел, здесь только 2 вида обособления.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
fchan=freefile
open filename for input as #fchan
    while not EOF(fchan)
        line input #fchan, t_str
        param=iif(left$(t_str, 1 )="[","[", "<<")
        blablabla=myParsing (t,str, param)
        ...
        ...
        ...
    wend
close #fchan

private function myParsing(byval SourceString as string, byval param as string) as string
    if param="[" then
        ...
        ...
    else
        ...
        ...
    end if
end function
Как-то так. Подобный подход сэкономит Вам время и нервы.
...
Рейтинг: 0 / 0
Текстовый файл и поиск
    #36616583
DUDALS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем за направление! Буду работать.:-)

Дело в том, что база находится в файле Аксеса. Обновление (слив) Аксес-аксес работает, но хочется еще сделать возможность обновлять из текстового файла, так как он занимает меньше места, поэтому база и сливается в текстовик с разграничителями. Может имеется какое-то лучшее решение?.
...
Рейтинг: 0 / 0
Текстовый файл и поиск
    #36616595
.Михаил.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DUDALS, регулярные выражения, может поможет
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Sub Test()
Dim i As Integer, i1 As Integer, str As String, mval As String, mmval() As String
Dim objRegExp As Object, objMatches As Object, objMatch As Object
str = "[TypeStr]<<УЛИЦА>><<ПЕРЕУЛОК>><<ПРОЕЗД>>"
str = str & "[NameStr]<<ПИРОГОВА>><<ВАНЕЕВА>><<ИЛИМСКАЯ>>"
str = str & "[info]<<ПЕТРОВ|ИВАН|ИВАНОВИЧ|3527|1|0>><<ПЕТРОВ|ИВАН|ИВАНОВИЧ|||>><<СВЕРИДОВ|ВИНИАМИН|ПЕТРОВИЧ||0|1>>" ' строка, прочитанная из файла
'------------------------------------------------------------------------------------------------------------------
Set objRegExp = CreateObject("VBScript.RegExp")
objRegExp.Pattern = "\[[^\]\[\<\>]*\]"
objRegExp.Global = True
Set objMatches = objRegExp.Execute(str)
For i =  0  To objMatches.Count -  1 
    Set objMatch = objMatches.Item(i)
    mval = Replace(objMatch.Value, "[", vbNullString)
    mval = Replace(mval, "]", vbNullString)
    MsgBox "Table=" & mval & ", " & "FirstIndex=" & objMatch.FirstIndex & ", " & "Length=" & objMatch.Length
Next
objRegExp.Pattern = "\<\<[^\]\[\<\>]*\>\>"
objRegExp.Global = True
Set objMatches = objRegExp.Execute(str)
For i =  0  To objMatches.Count -  1 
    Set objMatch = objMatches.Item(i)
    mval = Replace(objMatch.Value, "<<", vbNullString)
    mval = Replace(mval, ">>", vbNullString)
    MsgBox "ValueOfTable=" & mval & ", " & "FirstIndex=" & objMatch.FirstIndex & ", " & "Length=" & objMatch.Length
    If InStr(mval, "|") Then
        mmval = Split(mval, "|")
        For i1 =  0  To UBound(mmval,  1 )
            MsgBox "ValueOfTable=" & mval & ", Param №" & CStr(i1 +  1 ) & "=" & mmval(i1)
        Next
    End If
Next
Set objRegExp = Nothing
End Sub
на основании FirstIndex (позиция в строке) можно "раскидать" записи в определенные таблицы, а Param №X (если есть) это данные, короче, разберетесь что-куда
...
Рейтинг: 0 / 0
Текстовый файл и поиск
    #36616741
DUDALS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Михаил.

Спасибо большое.
С "VBScript.RegExp" никогда не использовал и даже не изучал его. Теперь понял, что придется. Полез учиться. :-)
...
Рейтинг: 0 / 0
Текстовый файл и поиск
    #36617988
ak787
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно гораздо проще

FileFullPath = "c:\Tables.txt"
Open FileFullPath For Input Lock Read Write As #1
While Not EOF(1)
Line Input #1, txtLine
txtLine = Trim(txtLine)
If Left(txtLine, 1) = "[" And Right(txtLine, 1) = "]" Then
tableName = Replace(txtLine, "[", "")
'имя таблицы
tableName = Replace(tableName, "]", "")
End If
If Left(txtLine, 2) = "<<" And Right(txtLine, 2) = ">>" Then
tableRow = Replace(txtLine, ">>", "")
'строка
tableRow = Replace(tableRow, "<<", "")
tableCols = Split(tableRow, "|")
For Each tableCol In tableCols
'цикл по столбцам строки

Next tableCol
End If
Wend
Close #1
...
Рейтинг: 0 / 0
Текстовый файл и поиск
    #36617991
ak787
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл выделить код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
FileFullPath = "c:\Tables.txt"
Open FileFullPath For Input Lock Read Write As # 1 
    While Not EOF( 1 )
        Line Input # 1 , txtLine
        txtLine = Trim(txtLine)
        If Left(txtLine,  1 ) = "[" And Right(txtLine,  1 ) = "]" Then
            tableName = Replace(txtLine, "[", "")
            'имя таблицы
            tableName = Replace(tableName, "]", "")
        End If
        If Left(txtLine,  2 ) = "<<" And Right(txtLine,  2 ) = ">>" Then
            tableRow = Replace(txtLine, ">>", "")
            'строка
            tableRow = Replace(tableRow, "<<", "")
            tableCols = Split(tableRow, "|")
            For Each tableCol In tableCols
                'цикл по столбцам строки
                
            Next tableCol
        End If
    Wend
Close # 1 
...
Рейтинг: 0 / 0
Текстовый файл и поиск
    #36618388
DUDALS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо добрый человека. Сейчас буду пробовать и разбираться!
...
Рейтинг: 0 / 0
Текстовый файл и поиск
    #36618581
cynep kopoBka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DUDALS,

Приведенный выше код извлекает, но не аккумулирует результирующие данные. Предусмотрите структуру для хранения. Иначе получите в итоге только последние значения переменных
TableName
TableRow
TableCol()
...
Рейтинг: 0 / 0
Текстовый файл и поиск
    #36618906
DUDALS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо огромное за участие! Да не покинет Вас коннект!!!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Текстовый файл и поиск
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]