24. februar 2006 - 08:59Der er
18 kommentarer og 1 løsning
Læs fra linje 8 og ud i tekstfil - FSO
Hej, Jeg er i tvivl om hvorledes jeg kan loope en tekstfil igennem fra linje 8 og så til filen slutter.
Filen kan indeholde alt fra 3-989050 linjer, efter linje 8.
Med denne kode, bryder jeg filen op i et array. --------------------------------------------------- set fso = Server.CreateObject("Scripting.FileSystemObject") set f = fso.OpenTextFile(filespec, 1, true) indholdet = f.ReadAll f.close set f = nothing set fso = nothing
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
Slettet bruger
24. februar 2006 - 09:09#1
Prøv med: <% set fso = Server.CreateObject("Scripting.FileSystemObject") set f = fso.OpenTextFile(filespec, 1, true) indholdet = f.ReadAll f.close set f = nothing set fso = nothing if arrIndholdet <> "" then arrIndholdet = split(indholdet, vbCrLf) for i=0 to ubound(arrIndholdet) linjetal=linjetal+1 if linjetal > 8 then teksten = teksten & arrIndholdet(i) else teksten = teksten end if next end if %> Response.Write teksten
Med så potentielt mange linier, tror jeg du skal droppe array'et igen, ellers tror jeg du render i performanceproblemer pga. resurseproblemer.
Brug i stedet sekventiel linielæsning fra filen:
dim header(7) set fso = Server.CreateObject("Scripting.FileSystemObject") set f = fso.OpenTextFile(filespec, 1, true) for i = 0 to 7 header(i) = f.ReadLine next
tekst = "" do while not f.eof ' læs til enden af filen tekst = tekst & f.ReadLine loop
f.close set f = nothing set fso = nothing
Det kunne dog være interessant at høre lidt mere om hvad du skal bruge denne læsning til, for det kan være at det kan løses på en smartere og mere effektiv måde.
God ide - Her kommer en nærmere forklaring af min udfordring.
I forbindelse med at jeg skal fremvise en graf (ASP) med 3 målinger, skal jeg indsamle data fra en vilkårlig række tekstfiler.
De første 7 linjer er altid placeret på samme linje. Konstant placering, med variabel værdi fra tekstfil til tekstfil.
Jeg skal nu have postet data fra hver tekstfil til en MS SQL database. Derfor vil jeg kunne løbe alle poster igennem for kategori 1 først, for derefter at forsætte med 2. kategori og slutte med 3.
Jeg har kodet de rutiner der finder alle filer i mappen og åbner dem en af gangen.
Håber det kan hjælpe.
----- Eksempel på Tekstfil ----- 05-12-2005 18:00:00 'Dato og tid for logstart 60 ' antal målinger i minuttet 3 'Antal målinger pr. kategori 3 'Antal kategorier Temperatur '1. kategori PH '2. kategori Pumpe '3. kategori 1268 'data for 1. katagori 1268 'data for 1. katagori 1268 'data for 1. katagori 758 'data for 2. katagori 758 'data for 2. katagori 759 'data for 2. katagori 0 'data for 3. katagori 0 'data for 3. katagori 1 'data for 3. katagori ----- Eksempel på Tekstfil -----
OK, så vil jeg da stadig anbefale den sekventielle læsning fra filen, selvom jeg tror den anden med array er hurtigere, er den som nævnt ikke så skalerbar (det virker dog ikke som en funktionalitet mange brugere skal have adgang til på én gang).
Den sekventielle læsning udemærker sig, ud over at være mere skalerbar en array-versionen, også ved at være simpel at implementere.
Der findes andre metoder til at læse blokke af data, men så bliver husholdningen noget mere arbejdskrævende. Det kan du jo overveje om er nødvendigt, hvis det andet ikke performer godt nok. ADODB-komponenten åbner også for muligheder for at læse binært, men den har jeg dog ikke så meget styr på, men vil blot nævne den, hvis du føler FSO-metoden er for sløv.
SoftSpot >>> Jeg har lige prøvet at ligge dit kode-eksempel ind. Når jeg prøver at afvikle, får jeg følgende fejl: Der opstod en Microsoft VBScript-kørselsfejl (0x800A003E) Input efter filens slutning (line 37)
SoftSpot >>> Efter lige at have tænkt dit eksempel igennem, tror at jeg bliver nød til at bruge array-versionen.
Bl.a. fordi at jeg skal kunne sætte nogle variabler ud fra de første 7 linjer. Og med array-versionen kan jeg angive præcist hvilken linje jeg vil hente. arrIndholdet(1) = linje 2.
Har du et bud hvordan jeg kan bruge array-versionen og så loop alle linjer fra-og-med linje 8 og så til filens slutning igennem?
Jeg undskylder fejlen. Jeg havde ikke checket efter i FSO-referencen og antog at det hed EOF (som det gør så mange andre steder), men det hedder AtEndOfStream i stedet, så loopet skulle se således ud:
do while not f.AtEndOfStream ' læs til enden af filen tekst = tekst & f.ReadLine loop
Mht. dit ønske om at læse de første 8 linier fra et array, så er det netop det denne konstruktion i mit eksempel håndterer:
for i = 0 to 7 header(i) = f.ReadLine next
med denne løkke bliver et array ved navn header fyldt med de første 8 linier af din tekstfil og du kan tilgå det efterfølgende ligesom du kunne da array'et hed arrIndholdet...
Hvis dette er repræsentativt for hvad der står i dine filer (uden kommentarer, eller hvad - i øvrigt kan jeg kun tælle 7 headerlinier, mangler der noget??):
05-12-2005 18:00:00 'Dato og tid for logstart 60 ' antal målinger i minuttet 3 'Antal målinger pr. kategori 3 'Antal kategorier Temperatur '1. kategori PH '2. kategori Pumpe '3. kategori 1268 'data for 1. katagori 1268 'data for 1. katagori 1268 'data for 1. katagori 758 'data for 2. katagori 758 'data for 2. katagori 759 'data for 2. katagori 0 'data for 3. katagori 0 'data for 3. katagori 1 'data for 3. katagori
så vil jeg jo mene at header(2) burde indeholde antallet af kategorier pr. måling og at du dermed kunne lave en løkke i løkken (som du selv foreslår). Du skal bare huske at checke for End Of Stream for hver linie du læser, ellers risikerer du Runtimefejl af den fæle slags - det vil du nok helst ikke :)
dim header(7) set fso = Server.CreateObject("Scripting.FileSystemObject") set f = fso.OpenTextFile(filespec, 1, true) for i = 0 to 7 if not f.AtEndOfStream then header(i) = f.ReadLine else response.write "Fejl ved læsning af filheader. Ugyldig filformat." exit for end if next
if not f.AtEndOfStream then do while not f.AtEndOfStream ' læs til enden af filen for i = 1 to header(2) if not f.AtEndOfStream then
datalinie = f.ReadLine ' TODO: indsæt i databasen...
else response.write "Fejl ved læsning af data. Ikke komplet dataformat." exit for ' Afslut indre løkke, hvis der ikke er mere data end if next loop end if
' Oprydning efter læsning f.close set f = nothing set fso = nothing
Hej SoftSpot - det er sgu svært at ligge fra sig :) - Dit eksempel virker fint.
For en god ordens skyld kommer her hele koden pt.: ------------------------ START ------------------------ Set FSO = CreateObject("Scripting.FileSystemObject") Set Folder = FSO.GetFolder("H:/data/")
For Each File In Folder.Files Response.Write(File.Name & "<br>")
dim header(6) Set fs = FSO.OpenTextFile("H:/data/"&File.Name, 1)
for i = 0 to 6 if not fs.AtEndOfStream then Header(i) = fs.ReadLine else response.write "Fejl ved læsning af filheader. Ugyldig filformat." exit for end if next
if not fs.AtEndOfStream then do while not fs.AtEndOfStream 'læs til enden af filen for i = 1 to Header(2) if not fs.AtEndOfStream then datalinie = fs.ReadLine response.Write(i & " " & datalinie&"<br>") ' TODO: indsæt i databasen... else response.write "Fejl ved læsning af data. Ikke komplet dataformat." exit for ' Afslut indre løkke, hvis der ikke er mere data end if next loop end if
fs.Close Next ------------------------ END ------------------------
Hej SoftSpot, Håber at kunne fange din opmærksomhed i dette lukkede spørgsmål.
Jeg har problemer med at se mig ud af loopene. For hver insert jeg laver vil gerne addere 1 sek. til var2 (klokkeslettet), men jeg kan simpelthen ikke få koden til at reagere på det.
...men rent bort set fra det, så kan du lægge tid til et tidspunkt med standardfunktionen dateAdd. Hvis du vil lægge sekunder til bruger du den således:
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.