PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » OpenSource » Примеры работы с dbf без дополнительных инструментов.


Примеры работы с dbf без дополнительных инструментов.

Сообщений 1 страница 3 из 3

1

Разбираю архивы. Есть заготовки которые мне точно не понадобятся но просто удалить жалко :)
По прежнему есть места, где инфа публикуется в dbf
И чаще всего это годами не изменяемая структура.
Для работы достаточно описать структуры и в путь.
Для примера КЛАДР (только ленивый что то не делал с ним в свои годы) и Почта

Код:
; U866.pbi
Dim U866.u(255)
;{
;===
U866($00) = $0000
U866($01) = $0001
U866($02) = $0002
U866($03) = $0003
U866($04) = $0004
U866($05) = $0005
U866($06) = $0006
U866($07) = $0007
U866($08) = $0008
U866($09) = $0009
U866($0A) = $000A
U866($0B) = $000B
U866($0C) = $000C
U866($0D) = $000D
U866($0E) = $000E
U866($0F) = $000F
;===
U866($10) = $0010
U866($11) = $0011
U866($12) = $0012
U866($13) = $0013
U866($14) = $0014
U866($15) = $0015
U866($16) = $0016
U866($17) = $0017
U866($18) = $0018
U866($19) = $0019
U866($1A) = $001A
U866($1B) = $001B
U866($1C) = $001C
U866($1D) = $001D
U866($1E) = $001E
U866($1F) = $001F
;===
U866($20) = $0020
U866($21) = $0021
U866($22) = $0022
U866($23) = $0023
U866($24) = $0024
U866($25) = $0025
U866($26) = $0026
U866($27) = $0027
U866($28) = $0028
U866($29) = $0029
U866($2A) = $002A
U866($2B) = $002B
U866($2C) = $002C
U866($2D) = $002D
U866($2E) = $002E
U866($2F) = $002F
;===
U866($30) = $0030
U866($31) = $0031
U866($32) = $0032
U866($33) = $0033
U866($34) = $0034
U866($35) = $0035
U866($36) = $0036
U866($37) = $0037
U866($38) = $0038
U866($39) = $0039
U866($3A) = $003A
U866($3B) = $003B
U866($3C) = $003C
U866($3D) = $003D
U866($3E) = $003E
U866($3F) = $003F
;===
U866($40) = $0040
U866($41) = $0041
U866($42) = $0042
U866($43) = $0043
U866($44) = $0044
U866($45) = $0045
U866($46) = $0046
U866($47) = $0047
U866($48) = $0048
U866($49) = $0049
U866($4A) = $004A
U866($4B) = $004B
U866($4C) = $004C
U866($4D) = $004D
U866($4E) = $004E
U866($4F) = $004F
;===
U866($50) = $0050
U866($51) = $0051
U866($52) = $0052
U866($53) = $0053
U866($54) = $0054
U866($55) = $0055
U866($56) = $0056
U866($57) = $0057
U866($58) = $0058
U866($59) = $0059
U866($5A) = $005A
U866($5B) = $005B
U866($5C) = $005C
U866($5D) = $005D
U866($5E) = $005E
U866($5F) = $005F
;===
U866($60) = $0060
U866($61) = $0061
U866($62) = $0062
U866($63) = $0063
U866($64) = $0064
U866($65) = $0065
U866($66) = $0066
U866($67) = $0067
U866($68) = $0068
U866($69) = $0069
U866($6A) = $006A
U866($6B) = $006B
U866($6C) = $006C
U866($6D) = $006D
U866($6E) = $006E
U866($6F) = $006F
;===
U866($70) = $0070
U866($71) = $0071
U866($72) = $0072
U866($73) = $0073
U866($74) = $0074
U866($75) = $0075
U866($76) = $0076
U866($77) = $0077
U866($78) = $0078
U866($79) = $0079
U866($7A) = $007A
U866($7B) = $007B
U866($7C) = $007C
U866($7D) = $007D
U866($7E) = $007E
U866($7F) = $007F
;===
U866($80) = $0410
U866($81) = $0411
U866($82) = $0412
U866($83) = $0413
U866($84) = $0414
U866($85) = $0415
U866($86) = $0416
U866($87) = $0417
U866($88) = $0418
U866($89) = $0419
U866($8A) = $041A
U866($8B) = $041B
U866($8C) = $041C
U866($8D) = $041D
U866($8E) = $041E
U866($8F) = $041F
;===
U866($90) = $0420
U866($91) = $0421
U866($92) = $0422
U866($93) = $0423
U866($94) = $0424
U866($95) = $0425
U866($96) = $0426
U866($97) = $0427
U866($98) = $0428
U866($99) = $0429
U866($9A) = $042A
U866($9B) = $042B
U866($9C) = $042C
U866($9D) = $042D
U866($9E) = $042E
U866($9F) = $042F
;===
U866($A0) = $0430
U866($A1) = $0431
U866($A2) = $0432
U866($A3) = $0433
U866($A4) = $0434
U866($A5) = $0435
U866($A6) = $0436
U866($A7) = $0437
U866($A8) = $0438
U866($A9) = $0439
U866($AA) = $043A
U866($AB) = $043B
U866($AC) = $043C
U866($AD) = $043D
U866($AE) = $043E
U866($AF) = $043F
;===
U866($B0) = $2591
U866($B1) = $2592
U866($B2) = $2593
U866($B3) = $2502
U866($B4) = $2524
U866($B5) = $2561
U866($B6) = $2562
U866($B7) = $2556
U866($B8) = $2555
U866($B9) = $2563
U866($BA) = $2551
U866($BB) = $2557
U866($BC) = $255D
U866($BD) = $255C
U866($BE) = $255B
U866($BF) = $2510
;===
U866($C0) = $2514
U866($C1) = $2534
U866($C2) = $252C
U866($C3) = $251C
U866($C4) = $2500
U866($C5) = $253C
U866($C6) = $255E
U866($C7) = $255F
U866($C8) = $255A
U866($C9) = $2554
U866($CA) = $2569
U866($CB) = $2566
U866($CC) = $2560
U866($CD) = $2550
U866($CE) = $256C
U866($CF) = $2567
;===
U866($D0) = $2568
U866($D1) = $2564
U866($D2) = $2565
U866($D3) = $2559
U866($D4) = $2558
U866($D5) = $2552
U866($D6) = $2553
U866($D7) = $256B
U866($D8) = $256A
U866($D9) = $2518
U866($DA) = $250C
U866($DB) = $2588
U866($DC) = $2584
U866($DD) = $258C
U866($DE) = $2590
U866($DF) = $2580
;===
U866($E0) = $0440
U866($E1) = $0441
U866($E2) = $0442
U866($E3) = $0443
U866($E4) = $0444
U866($E5) = $0445
U866($E6) = $0446
U866($E7) = $0447
U866($E8) = $0448
U866($E9) = $0449
U866($EA) = $044A
U866($EB) = $044B
U866($EC) = $044C
U866($ED) = $044D
U866($EE) = $044E
U866($EF) = $044F
;===        IBM
U866($F0) = $0401
U866($F1) = $0451
U866($F2) = $0404 ;$1FBA3
U866($F3) = $0454 ;$1FBA2
U866($F4) = $0407 ;$1FBA0
U866($F5) = $0457 ;$1FBA1
U866($F6) = $040E ;$2192
U866($F7) = $045E ;$2190
U866($F8) = $00B0 ;$2193
U866($F9) = $2219 ;$2191
U866($FA) = $00B7 ;$00F7
U866($FB) = $221A ;$00B1
U866($FC) = $2116 
U866($FD) = $00A4
U866($FE) = $25A0
U866($FF) = $00A0
;===
;}
Код:
;KLADRa.pbi
Structure _ALTNAMES_
  DEL.a
  OLDCODE.a[19]
  NEWCODE.a[19]
  LEVEL.a
EndStructure 
#H_ALTNAMES = 32+(32*3)+1
Define *pALTNAMES._ALTNAMES_
Define *pALTNAMES_
;===
Structure _DOMA_
  DEL.a
  NAME.a[40]
  KORP.a[10]
  SOCR.a[10]
  CODE.a[19]
  INDEX.a[6]
  GNINMB.a[4]
  UNO.a[4]
  OCATD.a[11]
EndStructure 
#H_DOMA = 32+(32*8)+1
Define *pDOMA._DOMA_
Define *pDOMA_
;===
Structure _KLADR_
  DEL.a
  NAME.a[40]
  SOCR.a[10]
  CODE.a[13]
  INDEX.a[6]
  GNINMB.a[4]
  UNO.a[4]
  OCATD.a[11]
  STATUS.a[1]
EndStructure 
#H_KLADR = 32+(32*8)+1
Define *pKLADR._KLADR_
Define *pKLADR_
;===
Structure _NAMEMAP_
  DEL.a
  CODE.a[17]
  NAME.a[250]
  SHNAME.a[40]
  SCNAME.a[10]
EndStructure 
#H_NAMEMAP = 32+(32*4)+1
Define *pNAMEMAP._NAMEMAP_
Define *pNAMEMAP_
;===
Structure _SOCRBASE_
  DEL.a
  LEVEL.a[5]
  SCNAME.a[10]
  SOCRNAME.a[29]
  KOD_T_ST.a[3]
EndStructure 
#H_SOCRBASE = 32+(32*4)+1
Define *pSOCRBASE._SOCRBASE_
Define *pSOCRBASE_
;===
Structure _STREET_
  DEL.a
  NAME.a[40]
  SOCR.a[10]
  CODE.a[17]
  INDEX.a[6]
  GNINMB.a[4]
  UNO.a[4]
  OCATD.a[11]
EndStructure 
#H_STREET = 32+(32*7)+1
Define *pSTREET._STREET_
Define *pSTREET_
;===
Код:
; PINDXNa.pbi
Structure _PINDXN_
  DEL.a
  INDEX.a[6]
  OPSNAME.a[60]
  OPSTYPE.a[50]
  OPSSUBM.a[6]
  REGION.a[60]
  AUTONOM.a[60]
  AREA.a[60]
  CITY.a[60]
  CITY1.a[60]
  ACTDATE.a[8]
  INDEXOLD.a[6]
EndStructure 
#H_PINDXN = 32+(32*11)+1
Define *pPINDXN._PINDXN_
Define *pPINDXN_

0

2

Код:
; заготовка 
; анализ символов содержащихся в таблицах КЛАДР
EnableExplicit
UseLZMAPacker()
XIncludeFile "KLADRa.pbi"
XIncludeFile "U866.pbi"
#PATH = ".\base.7z" ;https://fias.nalog.ru/WebServices/Public/GetLastDownloadFileInfo
Define i
Define *p.Ascii
Define *pl.Ascii
OpenConsole()
Define StartTime.q = ElapsedMilliseconds()
Dim cp866.i(255)
For i = 0 To 255
  cp866(i) = 0
Next 

If OpenPack(0, #PATH)
  
  If ExaminePack(0)
    While NextPackEntry(0)
      Select UCase(Trim(PackEntryName(0)))
        Case "ALTNAMES.DBF"
          *pALTNAMES_ = AllocateMemory(PackEntrySize(0))
          UncompressPackMemory(0, *pALTNAMES_, MemorySize(*pALTNAMES_))
          *pALTNAMES = *pALTNAMES_ + #H_ALTNAMES
          *p = *pALTNAMES
          *pl = *pALTNAMES_ + MemorySize(*pALTNAMES_)
          While *p < *pl
            cp866(*p\a) + 1 
            *p+1
          Wend 
          FreeMemory(*pALTNAMES_) : PrintN("ALTNAMES.DBF")
        Case "DOMA.DBF"
          *pDOMA_ = AllocateMemory(PackEntrySize(0))
          UncompressPackMemory(0, *pDOMA_, MemorySize(*pDOMA_))
          *pDOMA = *pDOMA_ + #H_DOMA
          *p = *pDOMA
          *pl = *pDOMA_ + MemorySize(*pDOMA_)
          While *p < *pl
            cp866(*p\a) + 1 
            *p+1
          Wend   
          FreeMemory(*pDOMA_) : PrintN("DOMA.DBF")
        Case "KLADR.DBF"
          *pKLADR_ = AllocateMemory(PackEntrySize(0))
          UncompressPackMemory(0, *pKLADR_, MemorySize(*pKLADR_))
          *pKLADR = *pKLADR_ + #H_KLADR
          *p = *pKLADR
          *pl = *pKLADR_ + MemorySize(*pKLADR_)
          While *p < *pl
            cp866(*p\a) + 1 
            *p+1
          Wend 
          FreeMemory(*pKLADR_) : PrintN("KLADR.DBF")
        Case "NAMEMAP.DBF"
          *pNAMEMAP_ = AllocateMemory(PackEntrySize(0))
          UncompressPackMemory(0, *pNAMEMAP_, MemorySize(*pNAMEMAP_))
          *pNAMEMAP = *pNAMEMAP_ + #H_NAMEMAP
          *p = *pNAMEMAP
          *pl = *pNAMEMAP_ + MemorySize(*pNAMEMAP_)
          While *p < *pl
            cp866(*p\a) + 1 
            *p+1
          Wend 
          FreeMemory(*pNAMEMAP_) : PrintN("NAMEMAP.DBF") 
        Case "SOCRBASE.DBF"
          *pSOCRBASE_ = AllocateMemory(PackEntrySize(0))
          UncompressPackMemory(0, *pSOCRBASE_, MemorySize(*pSOCRBASE_))
          *pSOCRBASE = *pSOCRBASE_ + #H_SOCRBASE
          *p = *pSOCRBASE
          *pl = *pSOCRBASE_ + MemorySize(*pSOCRBASE_)
          While *p < *pl
            cp866(*p\a) + 1 
            *p+1
          Wend 
          FreeMemory(*pSOCRBASE_) : PrintN("SOCRBASE.DBF")
        Case "STREET.DBF"
          *pSTREET_ = AllocateMemory(PackEntrySize(0))
          UncompressPackMemory(0, *pSTREET_, MemorySize(*pSTREET_))
          *pSTREET = *pSTREET_ + #H_STREET
          *p = *pSTREET
          *pl = *pSTREET_ + MemorySize(*pSTREET_)
          While *p < *pl
            cp866(*p\a) + 1 
            *p+1
          Wend 
          FreeMemory(*pSTREET_) : PrintN("STREET.DBF")
      EndSelect    
    Wend
  EndIf
  
  ClosePack(0)
  For i = 0 To 255
    If cp866(i) > 0
      PrintN(RSet(Hex(i),2,"0") + " - " + Chr(U866(i)) + " - " + Str(cp866(i)))
    EndIf  
  Next 
  PrintN(Str(ElapsedMilliseconds() - StartTime))
  Input()
  CloseConsole()
EndIf
Код:
; заготовка 
; анализ символов содержащихся в таблицах Почты
EnableExplicit
UseZipPacker()
XIncludeFile "PINDXNa.pbi"
XIncludeFile "U866.pbi"
#PATH = ".\P_Indx_0bf0888750.zip" ; https://www.pochta.ru/support/database/ops
Define i
Define *p.Ascii
Define *pl.Ascii
OpenConsole()
Define StartTime.q = ElapsedMilliseconds()
Dim cp866.i(255)
For i = 0 To 255
  cp866(i) = 0
Next 

If OpenPack(0, #PATH)
  If ExaminePack(0)
    While NextPackEntry(0)
      *pPINDXN_ = AllocateMemory(PackEntrySize(0))
      UncompressPackMemory(0, *pPINDXN_, MemorySize(*pPINDXN_))
      *pPINDXN = *pPINDXN_ + #H_PINDXN
      *p = *pPINDXN
      *pl = *pPINDXN_ + MemorySize(*pPINDXN_)
      While *p < *pl
        cp866(*p\a) + 1 
        *p+1
      Wend   
    Wend
    FreeMemory(*pPINDXN_) : PrintN("PIndx.dbf")
  EndIf
  ClosePack(0)
  
  For i = 0 To 255
    If  cp866(i) > 0 
      If cp866(i) > 0
        PrintN(RSet(Hex(i),2,"0") + " - " + Chr(U866(i)) + " - " + Str(cp866(i)))
      EndIf
    EndIf 
  Next 
  
  PrintN(Str(ElapsedMilliseconds() - StartTime))
  Input()
  CloseConsole()
EndIf

p.s. продолжение следует ....

Отредактировано useful (28.10.2026 14:52:54)

0

3

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

Код:
; PINDXNs.pbi
Structure _PINDXNS_
  DEL.c
  INDEX.s{6}
  OPSNAME.s{60}
  OPSTYPE.s{50}
  OPSSUBM.s{6}
  REGION.s{60}
  AUTONOM.s{60}
  AREA.s{60}
  CITY.s{60}
  CITY1.s{60}
  ACTDATE.s{8}
  INDEXOLD.s{6}
EndStructure 
Define *pPINDXNS._PINDXNS_
Define *pPINDXNS_
Код:
; заготовка 
; преобразование в утф строки Почты
EnableExplicit
UseZipPacker()
XIncludeFile "PINDXNa.pbi"
XIncludeFile "PINDXNs.pbi"
XIncludeFile "U866.pbi"
#PATH = ".\P_Indx_0bf0888750.zip"
Define i
Define *p.Ascii
Define *pl.Ascii
Define *ps.Unicode
OpenConsole()
Define StartTime.q = ElapsedMilliseconds()
Dim cp866.i(255)
For i = 0 To 255
  cp866(i) = 0
Next 

If OpenPack(0, #PATH)
  If ExaminePack(0)
    While NextPackEntry(0)
      *pPINDXN_  = AllocateMemory(PackEntrySize(0))
      
      UncompressPackMemory(0, *pPINDXN_, MemorySize(*pPINDXN_))
      *pPINDXN = *pPINDXN_ + #H_PINDXN
      *p = *pPINDXN
      *pl = *pPINDXN_ + MemorySize(*pPINDXN_)
      *pPINDXNS_ = AllocateMemory((PackEntrySize(0)-#H_PINDXN) * 2)
      *ps = *pPINDXNS_
      While *p < *pl
        *ps\u = U866(*p\a) 
        *p+1
        *ps+2
      Wend 
      CreatePack(1, "test.zip", #PB_PackerPlugin_Zip)
      AddPackMemory(1, *pPINDXNS_, MemorySize(*pPINDXNS_), "PINDX.DAT")
    Wend
    FreeMemory(*pPINDXN_) : PrintN("PIndx.dbf")
    *pPINDXNS = *pPINDXNS_
    PrintN(Trim(*pPINDXNS\INDEX) + "|" +
           Trim(*pPINDXNS\OPSNAME) + "|" +
           Trim(*pPINDXNS\OPSTYPE) + "|" +
           Trim(*pPINDXNS\OPSSUBM) + "|" +
           Trim(*pPINDXNS\REGION) + "|" +
           Trim(*pPINDXNS\AUTONOM) + "|" +
           Trim(*pPINDXNS\AREA) + "|" +
           Trim(*pPINDXNS\CITY) + "|" +
           Trim(*pPINDXNS\CITY1) + "|" +
           Trim(*pPINDXNS\ACTDATE) + "|" +
           Trim(*pPINDXNS\INDEXOLD))
    *pPINDXNS = *pPINDXNS + (9999 * SizeOf(_PINDXNS_))
    PrintN(Trim(*pPINDXNS\INDEX) + "|" +
           Trim(*pPINDXNS\OPSNAME) + "|" +
           Trim(*pPINDXNS\OPSTYPE) + "|" +
           Trim(*pPINDXNS\OPSSUBM) + "|" +
           Trim(*pPINDXNS\REGION) + "|" +
           Trim(*pPINDXNS\AUTONOM) + "|" +
           Trim(*pPINDXNS\AREA) + "|" +
           Trim(*pPINDXNS\CITY) + "|" +
           Trim(*pPINDXNS\CITY1) + "|" +
           Trim(*pPINDXNS\ACTDATE) + "|" +
           Trim(*pPINDXNS\INDEXOLD))  
    FreeMemory(*pPINDXNS_)
  EndIf
  ClosePack(0)
  
  PrintN(Str(ElapsedMilliseconds() - StartTime))
  Input()
  CloseConsole()
EndIf

p.s. если откопать последнюю версию допускающую сборку не юникодного кода, то структуры сразу можно использовать в виде {sss}

Отредактировано useful (28.10.2026 19:47:32)

0


Вы здесь » PureBasic - форум » OpenSource » Примеры работы с dbf без дополнительных инструментов.