powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Очень сложная задача
19 сообщений из 19, страница 1 из 1
Очень сложная задача
    #32245683
Фотография Deminik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На работе мне поставили задачу:

Дано:

1) есть текстовый файл C:\myfile.txt
файл содержит такие строки:
REG=40\KOD=175\NAME=МИХАИЛ
KOD=150\REG=56\NAME=ДМИТРИЙ
...
NAME=ЛЕОНИД\KOD=60\REG=77

2) БД mybd.mdb

3) в БД mybd.mdb- таблица Mytable
таблица содержит поля:Регион,Код,Имя

Задача:

произвести сохранение записей из myfile.txt в mytable, но следующим образом:
если обнаруживается в записи слово "REG=", то его значение "40", должно быть скопировано в поле "Регион" таблицы "Mytable"; если "KOD=", то "175" в поле "Код"; если "NAME=", то "Михаил" в поле "Имя" таблицы "Mytable".

В итоге, таблица mytable должна содержать такие записи:

Регион Код Имя
40 175 Михаил
56 150 Дмитрий
77 60 Леонид

Как это возможно реализовать ? Или вообще можно такое реализовать ?
Заранее огромное спасибо всем !!!
...
Рейтинг: 0 / 0
Очень сложная задача
    #32245707
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не очень сложная. Судя по вопросу - с VBA проблемы, иначе вопроса бы не не было.
Читаем файл по строкам
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Public Function readFile()
Dim strLine As String
Open  "C:\myfile.txt "  For Input As # 1 
    Do While Not EOF( 1 )
     Line Input # 1 , strLine
     MyPars strLine
    Loop
Close # 1 
End Function

и пишем разбор
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Public Function MyPars(strLineTxt As String)
Dim intSl1 As Integer
Dim str1 As String
Dim intKod As Integer
Dim rst As Recordset 'написано в A97!

intSl1 = InStr(strLineTxt, "\") 'Получаем позицию первого слеша
str1 = Left(strLineTxt, intSl1 -  1 ) 'получаем  строку до первого слеша

If InStr(str1, "KOD") > 0 Then 'если нашли выражение KOD
    intKod = Val(Mid(str1,  5 , Len(str1) -  4 )) 'получаем числовое значение KOD
End If

Set rst = CurrentDb.OpenRecordset("Mytable")
With rst ' добавление  записи
    .AddNew
    ![Код] = intKod
    .Update
End With

End Function


здесь приведено получение строки до первого слеша и проверка на нахождение в нем KOD, остальное сделайте сами, это же ваша работа :)
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249482
Фотография Deminik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БОЛЬШОЕ СПАСИБО !
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249488
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже сделали? На здоровье. Не очень сложно ведь. Нудновато, это да, но теперь вы имеете представление о работе со строками.
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249492
Фотография Deminik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поспешил...в поле КОД добавляются записи, но равны "0"...
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249501
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тут ловите ошибку
Код: plaintext
1.
2.
3.
4.
5.
If InStr(str1,  "KOD" ) >  0  Then 'если нашли выражение KOD
    Debug.Print str1  'анализируемый кусок строки
    Debug.Print Mid (str1,  5 , Len(str1) -  4 ) 'текстовый кусок с числом
    Debug.Print Val(Mid(str1, 5, Len(str1) - 4)) 'числовое значение
    intKod = Val(Mid(str1,  5 , Len(str1) -  4 )) 'получаем числовое значение KOD
End If

И смотрим в окне отладчика, что не так
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249544
Фотография Deminik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
\REG=40\KOD=175\NAME=МИХАИЛ

строка в тексте начинается с флэша, может быть поэтому str1 определяется как ноль "0" ?...Как его пропустить...
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249566
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так и надо было писать
тогда поиск поиск первого разделяющего слеша будет выглядеть так

Код: plaintext
1.
2.
intSl1 = InStr( 2 ,strLineTxt,  "\" ) 'Получаем позицию первого разделяющего слеша
и выделение первой строки
str1 = Mid (strLineTxt,2, intSl1 - 1) 'получаем  строку до первого разделяющего слеша
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249568
Фотография Deminik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поменял If InStr(str1, "KOD") > 0 на If InStr(str1, "KOD") = 0 и запись добавилась в таблицу нормально...что эта строка значит ?
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249575
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то можно бы было и в хелпе посмотреть, что
InStr возвращает 0, в случае, если вторая строка не найдена в первой, т.е. в данном случае
If InStr(str1, "KOD") = 0
KOD не в строке не найден
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249583
Фотография Deminik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переписал Вашу программу (Left на Mid) и все заработало, НО условие >0 все равно не дает результата (вставляет в поле все нули), а нормально работает только при =0.

Я бы был беспредельно счастлив, если бы Вы пояснили суть Вашего кода "на словах", чтобы я мог понять его принцип...
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249593
Фотография Deminik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а вообще, если поменять знак больше на равно- это глобально поменяет результаты программы ? И да, кстати, между какими строками мне лучше поместить второй обработчик ?
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249615
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне сложно писать больше чем написано в комментариях к строкам, а иначе нужно переписывать учебник по VB.
Конструкция
Код: plaintext
1.
2.
If InStr(str1,  "KOD" ) =  0  Then 'если нашли выражение KOD
    intKod = Val(Mid(str1, 5, Len(str1) - 4)) 'получаем числовое значение KOD
End If

выделяет числовое значение из строки в том случае, если в ней не найдено KOD, т.е видимо с REG. А обработку на REG и NAME вы как сделали?

А вообще, можно кинуть кусок реальных данных?

Рабочий день кончается, пойду в аптеку, магазин, зайду часа через полтора.
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249623
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И да, кстати, между какими строками мне лучше поместить второй обработчик ?
Обработчик, проверяющий наличие в строке KOD, NAME, REG лучше вынести в отдельную функцию, передавая в нее строку
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249642
Фотография Deminik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОГРОМНОЕ ВАМ СПАСИБО ЗА ПОМОЩЬ !!!
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249704
Фотография Deminik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, можно кинуть кусок реальных данных?
Реальные три строки файла myfile.txt
1)/REG=54/WMI=X4P/NAME=ОАО "НовосибООО"/MOD=4735/NDV=51300Н*21032283/NKUZ=33070020039311/NSH=33070020834233/PTS=54КК187139/VIN=Х4Р47350030000048/KODSP=20/COLOR=СНЕЖНО-БЕЛЫЙ/DOTGR=20012003/OPER=34/NPO=АНУЛИРОВАНА ИНН 701400319410/APO=РОССИЯ 1/DOK=№ ,20012003/REM=/DOP=20012003
2)/REG=54/WMI=X4P/NAME=ОАО "НовосибЛЛЛ"/MOD=2730НА/NDV=40630А*23111266/NKUZ=33020030181019/NSH=33020031911031/PTS=54АА187135/VIN=Х4Р2730НА30001709/KODSP=20/COLOR=СНЕЖНО-БЕЛЫЙ/DOTGR=14012003/OPER=34/NPO=ЗАО СЕРВИС ИНН 4200000291/APO=РОССИЯ 4 /DOK=№ ,14012003/REM=/DOP=14012003
3)/REG=54/WMI=X4P/NAME=ОАО "НовосибPPP"/MOD=2730НА/NDV=421500*21005451/NKUZ=33020020175577/NSH=33021021905214/PTS=54КК187134/VIN=Х4Р2730НА20001703/KODSP=20/COLOR=СНЕЖНО-БЕЛЫЙ/DOTGR=10012003/OPER=34/NPO=ОАО РУСИЧ ИНН 5410115075/APO=РОССИЯ 36 /DOK=№ ,10012003/REM=/DOP=10012003

Естественно 1),2) и 3)- в файле отсутствуют...

Mytable Поля: Region, WMI, NameOrg, Model ...

(REG=Region, WMI=WMI, NAME=NameOrg...)

Т.е. все записи из файла нужно сохранить в таблице БД и естественно без REG=, WMI=...Причем эти поля в файле могут идти по-разному (REG=,WMI= или наоборот)...
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249896
Фотография Alexander G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОХ, мля..... С этого нужно было и начинать!
Делаем таблицу соответствий Table1 и заполняем ее
Код: plaintext
1.
2.
3.
StringTxt        FieldTbl
REG=	       Region
WMI=            WMI
NAME=	       NameOrg

table 2 - это выходная таблица с полями (Region,WMI.....)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Function MyPars(strLineTxt As String)
Dim intTxt As Integer
Dim intSl As Integer
Dim rst1 As DAO.Recordset
Dim rst2 As DAO.Recordset
strLineTxt = strLineTxt &  "/" 
Set rst1 = CurrentDb.OpenRecordset( "Table1" )
Set rst2 = CurrentDb.OpenRecordset( "Table2" )

rst2.AddNew
rst1.MoveFirst

Do While Not rst1.EOF
    intTxt = InStr(strLineTxt, rst1!StringTxt)
    intSl = InStr(intTxt, strLineTxt,  "/" )
    rst2(rst1!FieldTbl) = Mid(strLineTxt, intTxt + Len(rst1!StringTxt), intSl - intTxt - Len(rst1!StringTxt))
    rst1.MoveNext
Loop

rst2.Update

End Function


Все, должно работать
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249933
Roalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно вот так:
Public Function readFile()
Dim strLine As String
Dim MYdb As Database, MyTable As Recordset, i As Long, k As Long, simb As String * 1, dozn As String, poslezn As String
Dim flagdozn As Boolean, qdf As QueryDef
Set MYdb = CurrentDb()
For i = 0 To MYdb.TableDefs.Count - 1
If MYdb.TableDefs(i).Name = "table1" Then
DoCmd.RunSQL "DROP TABLE table1"
Exit For
End If
Next i
DoCmd.RunSQL "CREATE TABLE table1 (Nomzap INTEGER, nampol TEXT, VALUEPOL TEXT);"
Set MyTable = MYdb.OpenRecordset("table1")
k = 0
dozn = ""
poslezn = ""
Open "C:\myfile.txt " For Input As #1
Do While Not EOF(1)
Line Input #1, strLine
k = k + 1

For i = 1 To Len(strLine)
simb = Mid(strLine, i, 1)
If simb = "\" Or simb = "/" Then simb = "/"
Select Case simb
Case "/"
If dozn <> "" Then
MyTable.AddNew
MyTable![Nomzap] = k
MyTable![nampol] = dozn
If poslezn <> "" Then
MyTable![VALUEPOL] = poslezn
End If
MyTable.Update
dozn = ""
poslezn = ""
End If
flagdozn = True
Case "="
flagdozn = False
Case Else
If flagdozn Then
dozn = dozn & simb
Else
poslezn = poslezn & simb
End If
End Select
Next i
Loop
Close #1

Set qdf = MYdb.CreateQueryDef("P1", "TRANSFORM First(table1.VALUEPOL) AS [Значение] SELECT table1.Nomzap FROM table1 GROUP BY table1.Nomzap PIVOT table1.nampol;")
DoCmd.SetWarnings False
DoCmd.RunSQL "SELECT P1.* INTO [table] FROM P1;"
DoCmd.SetWarnings True
DoCmd.DeleteObject acQuery, "P1"
End Function
...
Рейтинг: 0 / 0
Очень сложная задача
    #32249936
Roalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
М-да, пока писал пропустил предідущее сообщение.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Очень сложная задача
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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