Avatar billede hcar Novice
21. august 2018 - 11:53 Der er 4 kommentarer og
2 løsninger

Opdel ét felt i 2 felter

Windows 10 og Access 2016.
I en db findes et felt med adresse - som f eks "Adelgade Avenue 17 tv".
Hvordan kan sådan et felt deles i to felter som indeholder "Adelgade Avenue" og "17 tv".
Avatar billede terry Ekspert
21. august 2018 - 12:21 #1
I think you will need to use regular expressions

https://analystcave.com/excel-regex-tutorial/
Avatar billede bvirk Guru
21. august 2018 - 22:00 #2
https://www.regular-expressions.info/vbscript.html

er også et sted at søge inspiration.

Hvis en tabel: "Personer" har feltet "adresse" udfører følgende funktion (placeret i et standard modul) opgaven med både at oprette nye felter og splitte til gade og vejNr.

Sub splitfields()
    Const tbl = "Personer"
    With CurrentDb
        .Execute "alter table " & tbl & " add column gade text(120), vejNr text(20)"
        .Execute "update " & tbl & " set gade=gade(adresse), vejNr=vejNr(adresse)"
    End With
   
End Sub

Givet følgende hjælpefunktioner

Function regexWP()
    Static regO As Object
    If regO Is Nothing Then
        Set regO = New regexp
        regO.pattern = "\s\d.*"
    End If
    Set regexWP = regO
End Function

Function gade(adresse)
    Dim matchO
    Set matchO = regexWP.Execute(adresse)
    If matchO.count Then gade = Left(adresse, matchO.item(0).FirstIndex) Else gade = adresse
End Function
Function vejNr(adresse)
    Dim matchO
    Set matchO = regexWP.Execute(adresse)
    If matchO.count Then vejNr = Trim(Mid(adresse, 1 + matchO.item(0).FirstIndex)) Else vejNr = ""
End Function

regexp forefindes, måske afhængigt af access version, i referencen:
'Microsoft VBScript Regular Expressions
Avatar billede hcar Novice
22. august 2018 - 14:07 #3
bvirk: Din løsning er perfekt, Tusind tak!
Avatar billede Jørgen Kirkegaard Professor
22. august 2018 - 15:05 #4
Ikke for at drysse malurt i bægeret, jeg er bare nysgerrig. Kan den klare:

Christian 4 Vej 28
Adelgade 17A,
Holmbladsgade 108,5. (min adresse)
7. Tangvej

Eller er det en éngangsforestilling, hvor du så retter det sidste til i hånden?
Avatar billede terry Ekspert
22. august 2018 - 15:37 #5
I was going to comment on bvirks answer too. I'm sure it will work in most cases, but as Kirkegaardlive.dk indicates, there will almost certainly be addresses which it cant convert.
Avatar billede bvirk Guru
22. august 2018 - 18:51 #6
Ja, det er rigtigt, Kirkegaardlive.dk og terry
  .pattern = "\s\d.*"
er et simpelt regex pattern - der søges efter et enkelt talciffer med space foran og hvad som helst bagved.
Det skal så erstattes af noget mere komplet - men det overlader jeg til andre at finde ud af.

Rettelse:
Der mangler en 'End' statement i ovennævnte 'Sub splitfields()'- hvis man vil se effekt af ændring af regex pattern så brug denne.

Sub splitfields()
    Const tbl = "Personer"
    CurrentDb..Execute "update " & tbl & " set gade=gade(adresse), vejNr=vejNr(adresse)"
    End 'resets variable values (global and statics)
End Sub

Gentagende:
  ret i regO.pattern = ??, sæt markøren på splitfields -tast F5 og skift til tabel view
kan man så eksperimentere med regex patterns

NB

Kan se #2 ikke er effektiv - der dannes samme matchobject både gade(...) og vejNr(...) kaldet - man kunne også - sporende ændringer i adresse:

Function matchObject(adresse)
    Static regO, sAdr, matchO As Object
    If matchO Is Nothing Then
        Set regO = New regexp
        regO.pattern = "\s\d.*"
        sAdr = ""
    End If
    If sAdr <> adresse Then
        sAdr = adresse
        Set matchO = regO.Execute(sAdr)
    End If
    Set matchObject = matchO
End Function

Function gade(adresse)
    If matchObject(adresse).count Then gade = Left(adresse, matchObject(adresse).item(0).FirstIndex) Else gade = adresse
End Function
Function vejNr(adresse)
    If matchObject(adresse).count Then vejNr = Trim(Mid(adresse, 1 + matchObject(adresse).item(0).FirstIndex)) Else vejNr = ""
End Function
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester