Avatar billede jensen363 Forsker
26. januar 2006 - 11:05 Der er 66 kommentarer og
2 løsninger

Afkod/læs rækkeindhold fra venstre mod højre

Fortsættelse af http://www.eksperten.dk/spm/682500

Jeg har lavet en krysdstabulering på

Postnr
Rutenr
Gade
Husnr

Hvilket giver Husnr som kolonneoverskrift, øvrige som rækkeoverskrifter.

Værdien i Husnr-kolonnerne er enten 1 eller 0 ( 1 = sand ).

Dette giver en række som kunne se således ud ( ulige husnumre ):

1000,100,Roskildevej,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0

Ee eller andet geni som kan afkode den, så rækken aflæses fra venstre mod højre. Resultatet skal opdateres i en ny tabel med følgende :

Postnr
Rutenr
Gade
StartHusnr
SlutHusnr

Postmr, Rutenr og Gade giver sig selv, men StartHusnr hhv. SlutHusnr skal genereres efter følgende kriterier.

Første gang værdien 1 forekommer, skal kolonneoverskriften returneres som værdi i StartHusnr ... sidste gang 1 forekommer i intervalserien, skal kolonneoverskriften returneres som værdi i SlutHusnr ... ny post

Næste gang værdien 1 forekommer, skal kolonneoverskriften returneres som værdi i StartHusnr ... sidste gang 1 forekommer i intervalserien, skal kolonneoverskriften returneres som værdi i SlutHusnr ... ny post o.s.v. ... indtil rækken er slut

herefter fortsætten med næste række ....

Slutresultatet i tabellen vil så være

1000,100,Roskildevej,1,7
1000,100,Roskildevej,15,17
1000,100,Roskildevej,21,21

Er det muligt ?????
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 11:22 #1
Jeg tror det er muligt med en lille funktion, der gennemløber din krydstabulering.
Jeg prøver lige..
Avatar billede jensen363 Forsker
26. januar 2006 - 11:23 #2
Du kan godt få et datasæt stillet til rådighed :o)
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 11:30 #3
Ja, jeg tror næsten jeg har den nu, men jeg vil godt have et lille datasæt, så jeg kan teste det.
Min mail er: jesperfjoelner snabela hotmail.  com
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 11:31 #4
Husk at zippe den :-)
Avatar billede jensen363 Forsker
26. januar 2006 - 11:38 #5
sendt :o)
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 11:39 #6
Den er modtaget. Jeg vender lige tilbage om få minutter.
Avatar billede jensen363 Forsker
26. januar 2006 - 11:46 #7
Bare ok :o)
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 12:17 #8
Nu har jeg noget, der fungerer. Det eneste der mangler er, at koden fejler, hvor gaden f.eks. hedder "Christian X's gade" fordi der er en apostrof i gadenavnet. Jeg skal lige have fundet ud, hvordan man indsætter en apostrof via SQL. Men for alt andet virker det.


Function fixit()

Dim rs As dao.Recordset
Dim db As dao.Database
Dim StartHusNr As Long
Dim SlutHusNr As Long
Dim SQL As String
Dim s As String
Dim i As Long
Dim arr() As String

SQL = "SELECT * FROM Ligehusnumre"

Set db = CurrentDb
Set rs = db.OpenRecordset(SQL)

'laver array med feltnavne
For i = 3 To rs.Fields.Count - 1
    s = s & rs.Fields(i).Name
    If i <> (rs.Fields.Count - 1) Then
        s = s & ";"
    End If
Next
arr = Split(s, ";")
s = vbNullString
'gennemløber
Do While Not rs.EOF
    For i = 3 To rs.Fields.Count - 1
        s = s & rs(i)
    Next
    'Debug.Print "s:" & s
    StartHusNr = arr(InStr(1, s, "1") - 1)
    SlutHusNr = arr(InStrRev(s, "1") - 1)
    'indsæt i ny tabel
    SQL = "INSERT INTO tblCoopOutput (postnr,rutenr,gade,starthusnr,sluthusnr) VALUES (" & rs!postnr & "," & rs!rute & " ,'" & rs!gade & "'," & StartHusNr & "," & SlutHusNr & ")"
    'Debug.Print SQL
    db.Execute SQL, dbFailOnError
    rs.MoveNext
    s = vbNullString
Loop

'oprydning
Erase arr
rs.Close
Set rs = Nothing
Set db = Nothing

End Function
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 12:18 #9
Hvis jeg må skifte
Christian X's
med
Christian Xs
kan jeg få den helt færdig. Ellers skal vi lige finde ud af hvordan en apostrof indsættes via SQL.
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 12:21 #10
Jeg undersøger det lige...
Avatar billede jensen363 Forsker
26. januar 2006 - 12:23 #11
Damn ... du er hurtig ...

tester lige og vender tilbage
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 12:24 #12
Her virker den uden problemer


Function fixit()

Dim rs As dao.Recordset
Dim db As dao.Database
Dim StartHusNr As Long
Dim SlutHusNr As Long
Dim sql As String
Dim s As String
Dim i As Long
Dim arr() As String
'  2  34
'  18
'  2  44
sql = "SELECT * FROM Ligehusnumre"

Set db = CurrentDb
Set rs = db.OpenRecordset(sql)

'laver array med feltnavne
For i = 3 To rs.Fields.Count - 1
    s = s & rs.Fields(i).Name
    If i <> (rs.Fields.Count - 1) Then
        s = s & ";"
    End If
Next
arr = Split(s, ";")
s = vbNullString
'gennemløber
Do While Not rs.EOF
    For i = 3 To rs.Fields.Count - 1
        s = s & rs(i)
    Next
    'Debug.Print "s:" & s
    StartHusNr = arr(InStr(1, s, "1") - 1)
    SlutHusNr = arr(InStrRev(s, "1") - 1)
    'indsæt i ny tabel
    sql = "INSERT INTO tblCoopOutput (postnr,rutenr,gade,starthusnr,sluthusnr) VALUES (" & rs!postnr & "," & rs!rute & " ,'" & Replace(rs!gade, "'", "''") & "'," & StartHusNr & "," & SlutHusNr & ")"
    Debug.Print sql
    db.Execute sql, dbFailOnError
    rs.MoveNext
    s = vbNullString
Loop

'oprydning
Erase arr
rs.Close
Set rs = Nothing
Set db = Nothing

End Function
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 12:30 #13
Jeg fandt for øvrigt at du havde kalt "SlutHusNr" for "SutHusNr"
Det skal lige omdøbes, så du ikke får problemer.
Avatar billede jensen363 Forsker
26. januar 2006 - 12:36 #14
Det så jeg .... ;o)
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 12:47 #15
Kan du det til at virke?
Avatar billede jensen363 Forsker
26. januar 2006 - 12:48 #16
Den kører, genererer små 6000 rækker, men stopper så med subscript out of range
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 12:52 #17
Hvilken linjer stopper den på?
Er det på nogle af disse?

    StartHusNr = arr(InStr(1, s, "1") - 1)
    SlutHusNr = arr(InStrRev(s, "1") - 1)
Avatar billede jensen363 Forsker
26. januar 2006 - 12:53 #18
Jeg skal lige have fremprovokeret fejlen igen
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 12:56 #19
Kan det være noget med at den stopper på en linje, hvor der ikke står 1 i nogen af kolonnerne? Jeg tester lige.
Avatar billede jensen363 Forsker
26. januar 2006 - 12:56 #20
StartHusnr

Den har behandlet denne post :

INSERT INTO tblCoopOutput (postnr,rutenr,gade,starthusnr,sluthusnr) VALUES (2670,109 ,'Grevevej',10,40)

( du har ikke den komplette fil ) ... så du kan nok ikke se hvorfor

Jeg kigger lige i query hvad den næste er
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 12:58 #21
Her producerer den 921 linjer uden problemer. Men jeg har vist ikke alle data?
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 13:00 #22
Ok. Kan du se hvilken linje den breaker på? SQL'en ser god nok ud.
Avatar billede jensen363 Forsker
26. januar 2006 - 13:09 #23
Resultatet af :

INSERT INTO tblCoopOutput (postnr,rutenr,gade,starthusnr,sluthusnr) VALUES (2670,109 ,'Grevevej',10,40)

er reelt forkert ....

Det er den første vej hvor der overhovedet ikke er et eneste sammenhængende interval er det derfor ?
Avatar billede jensen363 Forsker
26. januar 2006 - 13:11 #24
Vil du have hele datafilen ( 160 Mb ) ... kan sendes via FTP
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 13:13 #25
Det med intervallet burde ikke være et problem.
Ja det vil godt prøve. Hvordan henter jeg den?

Jeg bliver nødt til at gå 1 times tid kl. 13.40.
Det er ikke sikkert jeg kan nå det inden da, men jeg prøver.
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 13:15 #26
er den 160mb zippet? Det er ok uanset hvad.
Avatar billede jensen363 Forsker
26. januar 2006 - 13:15 #27
Du får en mail med adressen du kan hente den fra
Avatar billede jensen363 Forsker
26. januar 2006 - 13:17 #28
Så er den klarr til at hente
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 13:19 #29
fino. Jeg er ved at hente den.
Avatar billede jensen363 Forsker
26. januar 2006 - 13:19 #30
Jeg er dig dybt taknemmelig :o)
Avatar billede jensen363 Forsker
26. januar 2006 - 13:29 #31
Jeg har lige testet med de ulige husnumre, og her fejler den også, men her er der sammenhængende intervaller :o(
Avatar billede jensen363 Forsker
26. januar 2006 - 13:42 #32
Jeg er ked af at sige det, men den gør det heller ikke rigtigt ved afvikling på ulige numre :

Postnr    Rutenr    Gade                StartHusnr    SlutHusnr
1654    5    Abel Cathrines Gade    13    13
1654    113    Abel Cathrines Gade    1    33
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 14:32 #33
Så er jeg tilbage fra frisøren. Jeg kigger på det med det samme. Det må være tæt på den der er.
Avatar billede jensen363 Forsker
26. januar 2006 - 14:39 #34
Gud ved om problemet ikke er, at der reelt ikke er "huller" i intervallerne, når man kigger isoleret på det eksempel jeg har vist 26/01-2006 13:42:55 ...

Hvis man isolere postnr og gade i krydstabellen, får du ingen 0 værdier på rute 113, og så er det returnerede jo korrekt ... forstår du ?

Jeg prøver ligt at oprette en tabel ud fra krydstabuleringen, og køre modulet derfra
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 14:53 #35
Jeg kan se at "subscript out of range" kommer når der ikke er 1'taller overhovedet i en række. Hvad skal funktionen gøre når det sker?
Avatar billede jensen363 Forsker
26. januar 2006 - 14:57 #36
Hmmm ... burde ikke forekomme ... hvis den ikke kan finde husnummer overhovedet, burde den vel ikke optræde i krydstabuleringen, ... men hvis der udelukkende er 0-er, skal der ikke indsættes en post i tabellen

Hvilket postnr,rute og gade forekommer det ?
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 14:57 #37
Jeg synes det ser ud til at virke her nu. Øjeblik så får du funktionen...
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 15:00 #38
Den her ser ud til at virke. Denne failer ikke på subscript out of range.

Jeg får bl.a.

post start slut
1654  2  26



Function FixCoop()

Dim rs As dao.Recordset
Dim db As dao.Database
Dim StartHusNr As Long
Dim SlutHusNr As Long
Dim sql As String
Dim s As String
Dim i As Long
Dim arr() As String

'ProgressBar 5, 1, "Åbner query..."
sql = "SELECT * FROM Ligehusnumre"

'1  2-34
'2  24-150
Set db = CurrentDb
Set rs = db.OpenRecordset(sql)

rs.MoveLast
rs.MoveFirst

'ProgressBar 5, 2, "Laver array..."
'laver array med feltnavne
For i = 3 To rs.Fields.Count - 1
    s = s & rs.Fields(i).Name
    If i <> (rs.Fields.Count - 1) Then
        s = s & ";"
    End If
Next
arr = Split(s, ";")
s = vbNullString
'gennemløber
Do While Not rs.EOF
    'ProgressBar rs.RecordCount, rs.AbsolutePosition - 1, ""
    For i = 3 To rs.Fields.Count - 1
        s = s & rs(i)
    Next
    If InStr(1, s, "1") > 0 Then
        StartHusNr = arr(InStr(1, s, "1") - 1)
        SlutHusNr = arr(InStrRev(s, "1") - 1)
    Else
        StartHusNr = 0
        SlutHusNr = 0
    End If
   
   
   
    'indsæt i ny tabel
    sql = "INSERT INTO tblCoopOutput (postnr,rutenr,gade,starthusnr,sluthusnr) VALUES (" & rs!postnr & "," & rs!rute & " ,'" & Replace(rs!gade, "'", "''") & "'," & StartHusNr & "," & SlutHusNr & ")"
    'Debug.Print sql
    db.Execute sql, dbFailOnError
    rs.MoveNext
    'Debug.Print s
    s = vbNullString
Loop

'oprydning
ProgressBar 1, 1, ""
Erase arr
rs.Close
Set rs = Nothing
Set db = Nothing

End Function
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 15:00 #39
Jeg er lige ved at lade den køre igennem for at se om der sker noget.
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 15:01 #40
Hvis der ingen ettaller er overhovedet indsætter den 0 som starthusnr og sluthusnr - er det i orden?
Avatar billede jensen363 Forsker
26. januar 2006 - 15:03 #41
Det er ok, så kan jeg sætte den til at rydde op bagefter
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 15:04 #42
Jeg prøver lige at sende den til dig. Jeg tror det kører.
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 15:06 #43
Jeg har zippet den og nu fylder den 12mb - kan jeg sende den eller hvordan?
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 15:06 #44
Den kan bare undlade at indsætte række, hvis der ikke er nogen 1-taller.
Avatar billede jensen363 Forsker
26. januar 2006 - 15:07 #45
12 Mb bliver afvist af vores mail, men du kan smide den tilbage i den FTP-mappe fra tidligere
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 15:12 #46
ok, smart. Det gør jeg.
Avatar billede jensen363 Forsker
26. januar 2006 - 15:16 #47
Jeg kan ikke "unzippe" den ... smid lige hele filen
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 15:21 #48
Så er den vist uploadet. Jeg har inkluderet en progressbar, så den viser hvor langt den er undervejs.
Avatar billede jensen363 Forsker
26. januar 2006 - 15:22 #49
Kan fortsat ikke unzippe den :o(
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 15:28 #50
Jeg prøver lige igen.
Avatar billede jensen363 Forsker
26. januar 2006 - 15:29 #51
Ok :o)
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 15:39 #52
Jeg har sendt dig en mail med et link.
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 18:16 #53
Hej igen, prøv at tjekke ftp-mappen. Jeg tror den er der nu.
Ellers sig bare til.
Avatar billede jensen363 Forsker
26. januar 2006 - 18:29 #54
jeg kigger
Avatar billede jensen363 Forsker
26. januar 2006 - 18:48 #55
Jeg må sige ... jeg er målløs ... den foreløbige stikprøvetest siger at det ser ud til at virke ....

Som du måske har observeret, begrænser jeg mine krydstabuleringer til at medtage husnumre til og med 500 ... ( dette af hensyn til max-grænsen for kolonner ), men reelt er der i de 1.9 mio. rækker husnumre op til 1.000 .... har jeg andre muligheder end at isolere dem i 4 krydstabuleringer ???
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 19:14 #56
mja, det kan være man kan løbe den store tabel igennem uden at krydstabulere. Jeg prøver lige at se om jeg kan komme på noget.
Avatar billede jensen363 Forsker
26. januar 2006 - 19:16 #57
Det er ikke noget du behøver at gøre for min skyld, men hvis du vil udfordre dig selv, er du da velkommen ... jeg vil gerne se resultatet ...

Jeg har self forsøgt det samme på hovedtabellen, men opgav og kastede mig istedet over den løsning du har arbejdet videre med ....

Den står og generere rækker i skrivende stund :o)
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 19:26 #58
din opdeling i lige/ulige numre er det kun for at begrænse antallet af kolonner i krydstabuleringen?
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 19:32 #59
Ja, det går ikke superhurtigt som det er nu, men det virker vist.
Jeg vil lige se om det kan laves for hele den store tabel på én gang.
Avatar billede jensen363 Forsker
26. januar 2006 - 19:37 #60
Jeg ved det faktisk ikke ... det er vores eksterne kunde som har bedt om at få det adskilt på den måde .... jeg tror det har noget at gøre med, at omdeling foregår på hver side af vejen ( deraf Lige/Ulige ) ... derfor skal der også genereres en række med de lige hudnumre og een med de ulige ...

Det har vist også noget med at gøre, at der er ruter som kun omdeler på enten lige eller ulige husnumre ...
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 20:14 #61
Hvordan får du så kørt det hele igennem? Laver du nogle mellemkørsler, hvor du begrænser kolonneantallet og så kører 3-4 stykker?
Avatar billede jensen363 Forsker
26. januar 2006 - 20:17 #62
Kunne ikke umiddelbart finde andre løsninger end at køre modulet 4 gange på hver sin krudstabulering med de nævnte husnummer begrænsninger
Avatar billede jensen363 Forsker
26. januar 2006 - 20:18 #63
1. kørsel dvs. lige numre fra 2 - 500 kørte ca. 50 minutter ( bemærk på Citrix )
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 21:28 #64
Er det hele så kørt nu? Så er der måske ingen grund jeg forsøger at lave det direkte på den store tabel. Det kunne nu godt lade sig gøre tror jeg.
Jeg tror det tog 5 min. her på min maskine lokalt. A64 3500+.
Avatar billede jensen363 Forsker
26. januar 2006 - 21:32 #65
Du kan sagtens bilde mig ind, at der kan gøres på 5 minutter på en maskine som ikke er tilknyttet er citrix-server :o)
Avatar billede jensen363 Forsker
26. januar 2006 - 21:33 #66
... men der er ikke noge grund til at lave det om ... princippielt er det lige gyldigt om det tager 1 eller 10 timer ... bare resultatet er ok ;o)
Avatar billede jensen363 Forsker
26. januar 2006 - 21:34 #67
Jeg vil bruge morgendagen på at syreteste resultatet ... men det ser umiddelbart korrekt ud ... du hører nærmere hvis der er mere
Avatar billede jesperfjoelner Nybegynder
26. januar 2006 - 21:39 #68
Lyder fint alt sammen. Jeg har sendt dig en mail. Vi vender tilbage til det, hvis noget mangler.
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