Avatar billede Chewie Novice
22. april 2008 - 10:28 Der er 13 kommentarer og
2 løsninger

Generer unik liste (300.000 linier)

Hej XLer

Jeg har virke brug for noget ekspert viden her

Jeg har en projektmappe med over 300.000 linjer fordelt på 12 ark

I kolonne A står det en tekst og i kolonne B står et nummer
Mange af teksterne i kolonne A er ens og jeg kunne godt tænke mig at generer en ny liste hvor dobbeltgængerne er fjernet og tallene er lagt sammen for de tekster der er ens.

Tænkt eks.
aaa | 2
bbb | 3
ccc | 2
aaa | 4
ccc | 1

bliver til

aaa | 6
bbb | 3
ccc | 3

Nogle løsningsforeslag ?
Avatar billede supertekst Ekspert
22. april 2008 - 10:43 #1
Vil der også være dobbeltgængere på tværs af de 12 ark?
Avatar billede Chewie Novice
22. april 2008 - 11:06 #2
Ja
Avatar billede supertekst Ekspert
22. april 2008 - 11:25 #3
Ok - har du nogen fornemmelse af, hvor mange unikke tekster, der kan være tale om?
Avatar billede Chewie Novice
22. april 2008 - 11:40 #4
Jeg vil tror der er en 30.000 til 40.000
Avatar billede supertekst Ekspert
22. april 2008 - 11:47 #5
Tak - så vil jeg tro at løsningen kunne blive følgende:
Gennemgang af hvert ark - række for række.
For enhverv celle i kolonne A udføres en søgning i et "SumArk" (Nyt).
Hvis A-tekst ikke findes - oprettes det og tal placeres i kolonne B
Hvis A-tekst findes - adderes tal til kolonne B.
Der skal føres løbende kontrol af, at rækkenr i SumArk ikke overstiger maks - er det tilfældet skiftes kolonner - f.eks. til D & E

Det skulle kunne lade sig gøre via VBA...
Avatar billede Chewie Novice
22. april 2008 - 12:20 #6
det er 90 milliarder udregninger

det tror jeg ikke jeg har kompetance til at lave - har du et foreslag til hvordan en makro der kan klare det ville se ud ?
Avatar billede supertekst Ekspert
22. april 2008 - 12:48 #7
Ja - det tror jeg nok. Skal prøve at konstruere en testmodel - vender herefter tilbage....
Avatar billede supertekst Ekspert
22. april 2008 - 14:08 #8
Rem Koden anbringes i ThisWorkbook
Rem Igangsættes fra VBA (nedenstående Sub F5) eller fra regnearket Alt+F8 - Startopdatering

Const maxRække = 65000
Public Sub startOpdatering()
Dim ark, sidsteRæk, ræk
Dim tekst, tal
Dim nxtSumræk, tekstkol
    nxtSumræk = 1
    tekstkol = 1
   
Rem Slet evt. optælling på SumArk
    clearSumArk
   
Rem Gennemgang af alle ark (excl. SumArk)
    For Each ark In ActiveWorkbook.Sheets
   
        If LCase(ark.Name) <> "sumark" Then
            ActiveWorkbook.Sheets(ark.Name).Activate
            sidsteRæk = ActiveCell.SpecialCells(xlLastCell).Row
            For ræk = 1 To sidsteRæk
                tekst = ActiveSheet.Cells(ræk, 1)
                tal = ActiveSheet.Cells(ræk, 2)
               
Rem opdater kun hvis tekst er udfyldt
                If tekst <> "" Then
                    opdaterTekst tekst, tal, nxtSumræk, tekstkol
                End If
            Next ræk
        End If
    Next
   
    ActiveWorkbook.Sheets("SumArk").Activate

    MsgBox ("Opdatering er afsluttet")
End Sub
Private Sub opdaterTekst(tekst, tal, nxtSumræk, tekstkol)
Dim sumArk
    Set sumArk = ActiveWorkbook.Sheets("SumArk")
   
    With sumArk.Range("A1:N65000")
        Set c = .Find(tekst, LookIn:=xlValues, LookAt:=xlWhole)

        If Not c Is Nothing Then
Rem Tekst er fundet
            række = c.Row
            kol = c.Column
            sumArk.Cells(række, kol + 1) = .Cells(række, kol + 1) + tal
        Else
            sumArk.Cells(nxtSumræk, tekstkol) = tekst
            sumArk.Cells(nxtSumræk, tekstkol + 1) = tal
           
            nxtSumræk = nxtSumræk + 1

Rem Check at næsteSum-række ikke overstiger 65000 - i.g.f. forskyd kolonne m/3
            If nxtSumræk > maxRække Then
                nxtSumræk = 1
                tekstkol = tekstkol + 3
            End If
        End If
    End With
End Sub
Private Sub clearSumArk()
    ActiveWorkbook.Sheets("SumArk").Activate
    Cells.ClearContents
End Sub
Avatar billede bauerdata Nybegynder
22. april 2008 - 14:14 #9
Eksportet dine data i csv form at og kør dette pytnon program

#!/usr/bin/env python
import csv
fname = "ark1.csv"
fnameout = "ark1sum.csv"
f = open(fname, "rb")
reader = csv.reader( f, dialect='excel' )
sumDict = {}
for line in reader:
    try:
        sumDict[ line[0] ] += int( line[1] )
    except:
        sumDict[ line[0] ] = int( line[1] )

f = open(fnameout, "w")
writer = csv.writer(f, dialect='excel')
writer.writerows( sumDict.items() )
Avatar billede Chewie Novice
22. april 2008 - 15:17 #10
supertekst > hvor kommer output ud henne ?
jeg får en "subscript out of range"

bauerdata >> jeg er ikke helt med på hvordan jeg køre din kode
Avatar billede supertekst Ekspert
22. april 2008 - 15:38 #11
Har du oprettet en nyt ark i filen med navnet SumArk? Her lagres output!
Avatar billede Chewie Novice
22. april 2008 - 16:13 #12
arh godmorgen ja :)

har sat computeren i gang :)
Avatar billede supertekst Ekspert
23. april 2008 - 14:29 #13
Hvordan gik det så?
Avatar billede Chewie Novice
23. april 2008 - 14:47 #14
Jeg kørte den af 4-5 omgange så løkkedes det

tak for hjælpen

(smid et svar)
Avatar billede supertekst Ekspert
23. april 2008 - 17:25 #15
Fint - og selv tak..
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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