|
| MSSQL-2000: DTS, import af fil Fra : Morten Snedker |
Dato : 18-01-06 15:44 |
|
Altså, ik'...
Poster skal importeres fra en fil. Filen er noget rod, så jeg er nød
til programmatisk at kode mig gennem hver linie.
Hele denne proces tage i dag 6-7 timer.
Som en del af dagligdagen kommer ugentlig en ny fil til, hvor nye
poster er kommet til. I filen er ingen marker, id eller andet, der
indentificerer den enkelte post.
Så for at undgå at skulle forholde mig til 500.000 poster, vil jeg
hellere forholde mig til differencen mellem de to. Det gør jeg ved at
tage hver hele linie og proppe i sin egen post. Det gør jeg for den
nuværende fil, samt den foregående (den fra i sidste uge).
De to tabeller joiner jeg - dem der er i den nye, men ikke den gamle
(den fra i sidste uge), er dem jeg er interesseret. Nu er det
pludselig kun 3-4% af linierne, jeg skal håndtere programmatisk.
Og:
Langt det hurtigste måde at få hevet de to filer (den nye og den
gamle) i hver sin tabel, er at lave en bulkcopy via et DTS-job.
Problemet er bare, det skal styres af en bruger ved en
Access-applikation. Brugeren peger på en bestemt fil, som så skal
indlæses. Filens navn og placering ændrer sig fra gang til gang.
Nogen idéer til, hvordan jeg kan klemme processen ind i noget
VBA-kode?
mvh /Snedker
| |
Jan Bachman (18-01-2006)
| Kommentar Fra : Jan Bachman |
Dato : 18-01-06 18:15 |
|
Er du så heldig at de nye rækker i den nye fil alle står i bunden af
filen? Eller er de nye rækker spredt i hele filen?
/Jan
| |
Jan Bachman (18-01-2006)
| Kommentar Fra : Jan Bachman |
Dato : 18-01-06 18:30 |
|
On Wed, 18 Jan 2006 18:15:28 +0100, Jan Bachman <jamen@davs.du> wrote:
>Er du så heldig at de nye rækker i den nye fil alle står i bunden af
>filen?
I så fald kan du slippe afsted med noget a.la nedenstående, eventuelt
med lidt kontroller for tomme linjer (typisk i bunden af filen).
Dim s As String
Dim nr As Long
Open "gammel" For Input As #1
nr = 0
While Not EOF(1)
Line Input #1, s
nr = nr + 1
Wend
Close #1
Open "ny" For Input As #1
While nr > 0
Line Input #1, s
nr = nr - 1
Wend
While Not EOF(1)
Line Input #1, s
' indsæt s i databasen
Wend
Close #1
| |
Morten Snedker (18-01-2006)
| Kommentar Fra : Morten Snedker |
Dato : 18-01-06 22:12 |
|
On Wed, 18 Jan 2006 18:29:50 +0100, Jan Bachman <jamen@davs.du> wrote:
>On Wed, 18 Jan 2006 18:15:28 +0100, Jan Bachman <jamen@davs.du> wrote:
>
>>Er du så heldig at de nye rækker i den nye fil alle står i bunden af
>>filen?
>
>I så fald kan du slippe afsted med noget a.la nedenstående, eventuelt
>med lidt kontroller for tomme linjer (typisk i bunden af filen).
Desværre ikke - jeg har ikke mulighed for at skippe lnier. Gid det var
så simpelt.
mvh /Snedker
| |
Morten Snedker (18-01-2006)
| Kommentar Fra : Morten Snedker |
Dato : 18-01-06 22:11 |
|
On Wed, 18 Jan 2006 18:15:28 +0100, Jan Bachman <jamen@davs.du> wrote:
>Er du så heldig at de nye rækker i den nye fil alle står i bunden af
>filen? Eller er de nye rækker spredt i hele filen?
Nej, så heldig er jeg ikke. Ingen markør, intet ID, ingen rækkefølge.
Jeg er nød til den ene eller anden vej at sammenligne nyt med gammelt,
en linie ad gangen. That's the whole prob... :-|
mvh /Snedker
| |
Jan Bachman (19-01-2006)
| Kommentar Fra : Jan Bachman |
Dato : 19-01-06 09:14 |
|
On Wed, 18 Jan 2006 22:10:49 +0100, Morten Snedker <morten@nospam.dk>
wrote:
>On Wed, 18 Jan 2006 18:15:28 +0100, Jan Bachman <jamen@davs.du> wrote:
>
>>Er du så heldig at de nye rækker i den nye fil alle står i bunden af
>>filen? Eller er de nye rækker spredt i hele filen?
>
>Nej, så heldig er jeg ikke. Ingen markør, intet ID, ingen rækkefølge.
>Jeg er nød til den ene eller anden vej at sammenligne nyt med gammelt,
>en linie ad gangen. That's the whole prob... :-|
Hmm.. surt show
En løsning kunne være at quicksorte de to tekstfiler til to nye
tekstfiler først, og så springe linjer over.
Du har en "sort" commando i dos, men jeg ved ikke hvilken algoritme
den bruger.
/Jan
| |
Jan Bachman (19-01-2006)
| Kommentar Fra : Jan Bachman |
Dato : 19-01-06 19:39 |
|
>En løsning kunne være at quicksorte de to tekstfiler til to nye
>tekstfiler først, og så springe linjer over.
At springe linjer over duer ikke, men man kan dog godt finde de nye
rækker via et enkelt gennemløb af begge filer, blot de begge er
sorterede.
/Jan
| |
Knud Winckelmann (18-01-2006)
| Kommentar Fra : Knud Winckelmann |
Dato : 18-01-06 18:28 |
|
Således skrev Morten Snedker den Wed, 18 Jan 2006 15:43:55 +0100:
>
>Nogen idéer til, hvordan jeg kan klemme processen ind i noget
>VBA-kode?
Jeg tænker straks på noget docmd.tranfertext og en passende
importspecifikation.
Det sidste kræver at du holder dig til mdb, da man ikke kan have det i
en adp.
Lav et fil-browser (eller brug evt. comdlg32-versionen) og vis
brugeren hvordan vedkommende skal finde filen og ellers bare trykke på
"Import"
Det er nok ikke noget, som kommer til at gå lynende hurtigt, så hvis
du har lidt tid til overs, så overvej at implementere en progress-bar
Knud
--
Q: Did you hear that Captain Crunch, Sugar Bear, Tony the Tiger
and Snap, Crackle and Pop were all murdered recently..?
A: Police suspect the work of a cereal killer!
| |
Michael Zedeler (18-01-2006)
| Kommentar Fra : Michael Zedeler |
Dato : 18-01-06 20:10 |
|
Morten Snedker wrote:
> Altså, ik'...
>
> Poster skal importeres fra en fil. Filen er noget rod, så jeg er nød
> til programmatisk at kode mig gennem hver linie.
>
> Hele denne proces tage i dag 6-7 timer.
>
> Som en del af dagligdagen kommer ugentlig en ny fil til, hvor nye
> poster er kommet til. I filen er ingen marker, id eller andet, der
> indentificerer den enkelte post.
>
> Så for at undgå at skulle forholde mig til 500.000 poster, vil jeg
> hellere forholde mig til differencen mellem de to. Det gør jeg ved at
> tage hver hele linie og proppe i sin egen post. Det gør jeg for den
> nuværende fil, samt den foregående (den fra i sidste uge).
Tillykke. Du har lige genopfundet UNIX-kommandoen "diff".
> Nogen idéer til, hvordan jeg kan klemme processen ind i noget
> VBA-kode?
Installér cygwin og skriv et bash-script (som finder de rigtige filer og
bruger diff). Det vil helt sikkert kunne køre pnt hurtigt. Du kan starte
scriptet fra en Windows-applikation, hvis brugerne ikke er så glade for
terminaler.
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf
| |
Morten Snedker (18-01-2006)
| Kommentar Fra : Morten Snedker |
Dato : 18-01-06 22:13 |
|
On Wed, 18 Jan 2006 20:10:01 +0100, Michael Zedeler
<michael@zedeler.dk> wrote:
>> Så for at undgå at skulle forholde mig til 500.000 poster, vil jeg
>> hellere forholde mig til differencen mellem de to. Det gør jeg ved at
>> tage hver hele linie og proppe i sin egen post. Det gør jeg for den
>> nuværende fil, samt den foregående (den fra i sidste uge).
>
>Tillykke. Du har lige genopfundet UNIX-kommandoen "diff".
Tak. Mon jeg kommer i et tidsskrift?
>> Nogen idéer til, hvordan jeg kan klemme processen ind i noget
>> VBA-kode?
>
>Installér cygwin og skriv et bash-script (som finder de rigtige filer og
>bruger diff). Det vil helt sikkert kunne køre pnt hurtigt. Du kan starte
>scriptet fra en Windows-applikation, hvis brugerne ikke er så glade for
>terminaler.
Jeg vil ta' et kig på det. Tak for input - jeg vender tlibage.
mvh /Snedker
| |
Morten Snedker (18-01-2006)
| Kommentar Fra : Morten Snedker |
Dato : 18-01-06 22:25 |
|
On Wed, 18 Jan 2006 20:10:01 +0100, Michael Zedeler
<michael@zedeler.dk> wrote:
>Installér cygwin og skriv et bash-script (som finder de rigtige filer og
>bruger diff). Det vil helt sikkert kunne køre pnt hurtigt. Du kan starte
>scriptet fra en Windows-applikation, hvis brugerne ikke er så glade for
>terminaler.
Og dog...er det nu også det jeg skal bruge:
Fil-1:
ABC
DEF
GHI
JKL
Fil-2:
ABC
MNO
DEF
JKL
Differencen, i min aktuelle verden, er her MNO, fordi den linie ikke
findes i Fil-1. Så jeg er ikke interesseret i en fil-difference i
egentlig forstand. Det skal mere betragtes som poster i en tabel, hvor
nogle findes i Fil-2, men ikke Fil-1....og det er disse jeg er
interesseret i.
Den umiddelbart bedste performance opnår jeg ved importere hver fil
til ét felt i hver sin tabel, joine tabellerne og dermed finde
differencen. Dermed reduceres den samlede kørsel fra ca. 7 timer til
50 minutter.
Mit problem er at afvikle et batch-job via ADO. Måske jeg ikke er i
det rette forum...jeg prøver at Google lidt mere...eller microsofts
newsserver.
Tak for input anywayz.
mvh /Snedker
| |
Michael Zedeler (18-01-2006)
| Kommentar Fra : Michael Zedeler |
Dato : 18-01-06 23:13 |
|
Morten Snedker wrote:
> On Wed, 18 Jan 2006 20:10:01 +0100, Michael Zedeler
> <michael@zedeler.dk> wrote:
>
>>Installér cygwin og skriv et bash-script (som finder de rigtige filer og
>>bruger diff). Det vil helt sikkert kunne køre pnt hurtigt. Du kan starte
>>scriptet fra en Windows-applikation, hvis brugerne ikke er så glade for
>>terminaler.
>
>
> Og dog...er det nu også det jeg skal bruge:
>
> Fil-1:
> ABC
> DEF
> GHI
> JKL
>
>
> Fil-2:
> ABC
> MNO
> DEF
> JKL
>
> Differencen, i min aktuelle verden, er her MNO, fordi den linie ikke
> findes i Fil-1. Så jeg er ikke interesseret i en fil-difference i
> egentlig forstand. Det skal mere betragtes som poster i en tabel, hvor
> nogle findes i Fil-2, men ikke Fil-1....og det er disse jeg er
> interesseret i.
Her er et script, som burde give nogenlunde det, du er på udkig efter
sort oprindelig > oprindelig.sorteret
sort ny > ny.sorteret
comm -1 -3 oprindelig.sorteret ny.sorteret
Med Fil-1 -> oprindelig og Fil-2 -> ny, får jeg:
MNO
comm er en forsimplet version af diff. Prøv "man comm".
> Den umiddelbart bedste performance opnår jeg ved importere hver fil
> til ét felt i hver sin tabel, joine tabellerne og dermed finde
> differencen. Dermed reduceres den samlede kørsel fra ca. 7 timer til
> 50 minutter.
Det er altså også meget lang tid. Jeg tror ovensående vil køre hurtigere.
> Mit problem er at afvikle et batch-job via ADO. Måske jeg ikke er i
> det rette forum...jeg prøver at Google lidt mere...eller microsofts
> newsserver.
Det kan jeg desværre ikke hjælpe med, men 7 timers køretid er et
argument for at prøve lidt af hvert. Prøv at se om ikke ovenstående
giver det ønskede resultat.
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
Visit my home page at http://michael.zedeler.dk/
Get my vcard at http://michael.zedeler.dk/vcard.vcf
| |
Morten Snedker (19-01-2006)
| Kommentar Fra : Morten Snedker |
Dato : 19-01-06 08:30 |
|
On Wed, 18 Jan 2006 23:13:12 +0100, Michael Zedeler
<michael@zedeler.dk> wrote:
-klip-
>> Den umiddelbart bedste performance opnår jeg ved importere hver fil
>> til ét felt i hver sin tabel, joine tabellerne og dermed finde
>> differencen. Dermed reduceres den samlede kørsel fra ca. 7 timer til
>> 50 minutter.
>
>Det er altså også meget lang tid. Jeg tror ovensående vil køre hurtigere.
Nu skal det lige siges, at det samlede tidsforbrug ikke blot er
importen, men behandlingen af den enkelte linie.
Men tak for dit input igen. Jeg vil prøve det af en af de nærmeste
dage, og se om jeg på en snild facon kan få det implementeret.
mvh /Snedker
| |
Peter Brodersen (18-01-2006)
| Kommentar Fra : Peter Brodersen |
Dato : 18-01-06 23:24 |
|
On Wed, 18 Jan 2006 20:10:01 +0100, Michael Zedeler
<michael@zedeler.dk> wrote:
>Installér cygwin og skriv et bash-script (som finder de rigtige filer og
>bruger diff). Det vil helt sikkert kunne køre pnt hurtigt. Du kan starte
>scriptet fra en Windows-applikation, hvis brugerne ikke er så glade for
>terminaler.
Cygwin, blot for et simpelt script? Mon ikke, værktøjerne i unxutils
kan klare samme opgave?
--
- Peter Brodersen
Find dig selv: http://map.ter.dk/
| |
|
|