Just nu i M3-nätverket
Gå till innehåll

Från text till Access - tappar bort poster


Christoph

Rekommendera Poster

Hej,

 

jag försöker importera ett stort text-fil (25 mb med över 600.000 rader) till (tyvärr...) Access. Detta är koden:

 

  [b]Server[/b].ScriptTimeout = 2500
  [color="#0000ff"]Set[/color] fs=[b]Server[/b].[color="#0000ff"]CreateObject[/color]([GRÅ]"Scripting.FileSystemObject"[/GRÅ])
  [color="#0000ff"]Set[/color] f=fs.OpenTextFile([b]Server[/b].MapPath([GRÅ]"a.txt"[/GRÅ]), 1)
  [color="#0000ff"]Dim[/color] conn
  [color="#0000ff"]Set[/color] conn = [b]Server[/b].[color="#0000ff"]CreateObject[/color]([GRÅ]"ADODB.Connection"[/GRÅ])

  Conn.Open([GRÅ]"DRIVER={Microsoft Access Driver (*.mdb)}; DBQ="[/GRÅ] & [b]Server[/b].MapPath([GRÅ]"nix.mdb"[/GRÅ]))
  Conn.[color="#0000ff"]Execute[/color] ([GRÅ]"Delete * from Nix"[/GRÅ])
  RiktNrOut = [GRÅ]""[/GRÅ]
  [color="#0000ff"]Do[/color] [color="#0000ff"]While[/color] f.AtEndOfStream = [color="#0000ff"]False[/color]
    i = i + 1
    RiktNr = [color="#0000ff"]Left[/color](f.ReadLine, 8)
    TelNr = [color="#0000ff"]Right[/color](f.Readline, [color="#0000ff"]Len[/color](f.ReadLine)-8)
    RiktNr = [color="#0000ff"]Trim[/color](riktnr)
    TelNr = [color="#0000ff"]Trim[/color](telnr)
    Conn.[color="#0000ff"]Execute[/color] ([GRÅ]"Insert Into Nix (RiktNr, TelNr) Values('"[/GRÅ] & RiktNr & [GRÅ]"', '"[/GRÅ] & TelNr & [GRÅ]"')"[/GRÅ])
    [color="#0000ff"]If[/color] RiktNrOut <> RiktNr [color="#0000ff"]Then[/color]
      [b]Response[/b].Write RiktNr & [GRÅ]" ("[/GRÅ] & i & [GRÅ]"); "[/GRÅ]
      RiktNrOut = RiktNr
    [color="#0000ff"]End[/color] [color="#0000ff"]If[/color]
  [color="#0000ff"]Loop[/color]
  Conn.Close
  F.Close
  [color="#0000ff"]Set[/color] f=[color="#0000ff"]Nothing[/color]
  [color="#0000ff"]Set[/color] fs=[color="#0000ff"]Nothing[/color]

 

Det funkar i princip rätt bra - problemet är dock att ca. 2/3 av inläggen inte importeras... Jag skrev ut när RiktNr ändras (If RiktNrOut <> RiktNr Then Response.Write RiktNr & " (" & i & "); ")), för att kunna hålla koll på vad som händer och för att kunna se radnummret i text-filen, men det är ett mysterium - den byter riktnr redan vid ca. 3.043, även om nästa rikt-nr i text-filen först borde komma i rad 9.100... Varför skrivs inte alla inlägg i Access-databasen? Läses dem inte? Hoppar min loop över en massa rader? Varför isf?

 

Tacksam för all hjälp!!!

 

Christoph

 

[inlägget ändrat 2005-01-24 18:52:02 av Christoph]

Länk till kommentar
Dela på andra webbplatser

Helt omöjligt att veta om du inte postar en bit av textfilen så vi får se vilket format den har.

 

När du gör en ReadLine läses nästa rad in, inte samma rad, ser verkligen textfilen ut så med riktnummer på en rad, telnummer på nästa och såvidare ?

 

Gör readline EN gång per loop, spara denna i en variabel och använd sedan denna när du plockar ut de olika delarna,

 

Länk till kommentar
Dela på andra webbplatser

Är det inte så att varje gång man kör "readline" så läses en ny rad in?

 

Testa detta (ersätt relevanta rader i din kod med dessa) :

 

 

Do While f.AtEndOfStream = False

i = i + 1

raden = f.ReadLine

 

RiktNr = Left(raden, 8)

TelNr = Right(raden, Len(raden)-8)

 

 

 

 

Länk till kommentar
Dela på andra webbplatser

Detta är ett exempel på filen:

 

011       123456                        
011       234567                        
011       345678                        
011       456789

 

RiktNr och TelNr visas rätt, från samma rad.

 

Länk till kommentar
Dela på andra webbplatser

Helt rätt - jag får ut 615.000 inlägg som variabeln i räknar.

 

Kör jag med att spara inläggen i Access-databasen, räknar den upp till 205.158 och dumpar ner dessa inlägg i Access... Mysko...

 

/Christoph

 

Länk till kommentar
Dela på andra webbplatser

Det håller på att köras och det verkar se rätt okej ut:

 

011 (2); 0120 (9158); 0121 (9948); 0122 (10914); 0123 (12436); 0125 (12933); 013 (13215); 0140 (25564); 0141 (26933); 0142 (30035); 0143 (32318); 0144 (32866); 0150 (33130); 0151 (35256); 0152 (35782); 0155 (37168); 0156 (42151); 0157 (42958); 0158 (44147); 0159 (45023); 016 (45734); 0171 (51510); 0173 (54888); 0174 (55981); 0175 (56657); 0176 (57606); 018 (59523); 019 (76555); 021 (87509); 0220 (95788); 0221 (97314); 0222 (98820); 0223 (99087); 0224 (100517); 0225 (102048); 0226 (103906); 0227 (105996); 02270 (106412); 023 (106413); 0240 (110571); 0241 (113654); 0243 (114465); 0246 (118734); 0247 (119193); 0248 (120392); 0250 (120915);

 

Det som visas i parentes är rad-nummret. Hur kommer det sig att din kod funkade men inte min?

 

Länk till kommentar
Dela på andra webbplatser

Ah - nu förstod jag hur du menade... Jag hoppade fram 3-4 ggr genom "readline"...

 

Tack för hjälpen!!!

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...