Avatar billede sansalvador Nybegynder
21. august 2006 - 15:27 Der er 4 kommentarer og
1 løsning

Sammenligne to pris-filer og spytte diff-fil ud

Hejsa,

jeg står med et lille personligt projekt, som skal løses i VB.

Jeg har to prisfiler - begge med syntaksen:

VARENUMMER;COSTPRIS;SALGSPRIS
Eks: 5395836;55,34;88,23 (ny linie) osv

Den ene fil bliver lavet eksporteres fra en hjemmeside, den anden fil bliver eksporteret fra C5.

Pointen er så, at mit program (som jeg har bygget, har bare ikke den væsentlige algoritme) skal kunne sammenligne hjemmeside-filen med C5-filen.

Hvis programmet detekterer en ændring ud for det pågældende varenummer,
skal den lave en ny linie i en ny og trejde fil med C5-filens oplysninger.

Jeg er ikke den store haj til VB, så jeg skal bruge hjælp til at finde ud af at smide de to filer i to arrays, hvorefter jeg kan sammenligne hvert varenummer med hinanden, og se om de to pågældendes varenummer har ændringer i cost- og salgspris. Hvis der i så fald ér en ændring, så skal linien fra C5-filen blot smides i en ny fil, sammen med alle de andre detekterede ændringer.

Egentlig blot et differense-program, hvor C5-filen bestemmer :)

Nogen der kan hjælpe? :)

Mvh
Sam Høj
Avatar billede supertekst Ekspert
21. august 2006 - 15:31 #1
Ren VB eller VBA?
Avatar billede supertekst Ekspert
21. august 2006 - 16:28 #2
Findes filerne p.t. som text-filer?

Forslag:
Filerne kunne så evt. læses ind i et regneark - side om side - hvori den 3. fil så også blev dannet og udskrevet som tekstfil.
Avatar billede kjulius Novice
21. august 2006 - 21:09 #3
Andre oplysninger, som kunne være interessante at få oplyst:

Er der lige mange varer i hver fil? - kan man skiftevis læse en record fra filerne og sammenligne?
Er filerne sorteret i varenummerorden? - har betydning for den optimale søgemetode.
Er det VB eller VB.NET du programmerer i? - eller for den sags skyld VBA (Visual Basic for Application - altså i VB til et af Office programmerne)?
Er det altid med ; som separator? - Original VB har bedre mulighed for direkte at læse komma-separerede filer med input# funktionen (men den europæiske standard for eksport til en CSV-fil er jo desværre semikolon-separeret).
Avatar billede sansalvador Nybegynder
22. august 2006 - 01:26 #4
Filerne er ALTID txt-filer.

Der er ikke lige mange varer i hver fil.

Nej, det varene kan ikke forventes at komme i nummerorden.

VBA er typen der programmeres i ...Visual Basic 6.0 for den sags skyld. =)

Det er med ; som seperator, da prisdatabasen desværre før min tid har fået komma ind som decimal-seperator.

Håber det var behjælpeligt :)
Avatar billede supertekst Ekspert
22. august 2006 - 14:19 #5
Følende kode er afprøvet i Word VBA-Thisdocument:

Const maxLin = 5000

Dim xsti, c5Arr(maxLin, 3), c5Antal, antalDiff
Sub start()
On Error Resume Next
    Close #1
    Close #2
    Close #3
   
    antalDiff = 0
   
    hentSti
   
Rem sletter evt gl. diff.txt
    Kill xsti + "diff.txt"
   
    hentfil_C5
    hentfil_HP
   
    MsgBox ("sammenligning er afsluttet - antal diff.: " + CStr(antalDiff))
End Sub
Private Sub hentfil_HP()
Dim vnr As Long, kost As Single, salg As Single

    Open xsti + "HP.txt" For Input As #2
    Input #2, overskrifter
   
    While Not EOF(2)
      Line Input #2, linie
      adskilLinien linie, vnr, kost, salg
      findC5linien vnr, kost, salg
    Wend
    Close #2
End Sub
Private Sub findC5linien(hpVnr, hpKost, hpSalg)
Dim f
    For f = 0 To c5Antal - 1
Rem findes varenr i C5
        If hpVnr = c5Arr(f, 0) Then
            If hpKost <> c5Arr(f, 1) Or hpSalg <> c5Arr(f, 2) Then
                skrivDiff c5Arr(f, 0), c5Arr(f, 1), c5Arr(f, 2)
                Exit Sub
            End If
        End If
    Next f
End Sub
Private Sub skrivDiff(c5Vnr, c5Salg, c5Kost)
Dim linie
    antalDiff = antalDiff + 1
   
    Open xsti + "Diff.txt" For Append As #3
    Write #3, c5Vnr; c5Salg; c5Kost
    Close #3
End Sub
Private Sub hentfil_C5()
Dim vnr As Long, kost As Single, salg As Single

    Open xsti + "c5.txt" For Input As #1
    Input #1, overskrifter
   
    While Not EOF(1)
      Line Input #1, linie
      adskilLinien linie, vnr, kost, salg
      c5Arr(c5Antal, 0) = vnr
      c5Arr(c5Antal, 1) = kost
      c5Arr(c5Antal, 2) = salg
      c5Antal = c5Antal + 1
    Wend
    Close #1
End Sub
Private Function adskilLinien(linie, vnr, kost, salg)
Dim p, lin, count, del
    lin = linie + ";"
    count = 0
    While InStr(lin, ";") > 0
        p = InStr(lin, ";")
        If p > 0 Then
            del = Left(lin, p - 1)
            Select Case count
                Case 0
                    vnr = del
                Case 1
                    kost = del
                Case 2
                    salg = del
            End Select
            lin = Mid(lin, p + 1)
            count = count + 1
        Else
            Stop
        End If
    Wend
   
End Function
Private Sub hentSti()
    xsti = ActiveDocument.Path
    If Right(xsti, 1) <> "\" Then
        xsti = xsti + "\"
    End If
End Sub


Test DATA:
Sammenligning af pris-filer

C5
VARENUMMER;COSTPRIS;SALGSPRIS
5395836;55,34;88,13
5395837;44,00;77,35
5395830;101,00;125,35
5395831;15,00;27,75
5395839;155,34;188,23

HP
VARENUMMER;COSTPRIS;SALGSPRIS
5395836;55,34;88,23
5395837;44,00;77,35
5395830;100,00;125,35
5395831;15,00;27,7

Diff
5395836,55.34,88.13
5395830,101,125.35
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
Kurser inden for grundlæggende programmering

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