/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
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/

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste