Avatar billede wolfgang Praktikant
24. februar 2006 - 08:59 Der 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

arrIndholdet = split(indholdet, vbCrLf)
---------------------------------------------------

Jeg glæder mig til at høre fra jer.
Avatar billede 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

- Kan det ikke bruges?

\Dan
Avatar billede softspot Forsker
24. februar 2006 - 09:18 #2
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.
Avatar billede wolfgang Praktikant
24. februar 2006 - 09:38 #3
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 -----
Avatar billede softspot Forsker
24. februar 2006 - 09:55 #4
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.
Avatar billede wolfgang Praktikant
24. februar 2006 - 10:11 #5
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)

Linje 37
header(i) = fs.ReadLine
Avatar billede wolfgang Praktikant
24. februar 2006 - 10:16 #6
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?
Avatar billede softspot Forsker
24. februar 2006 - 10:45 #7
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...
Avatar billede wolfgang Praktikant
24. februar 2006 - 10:47 #8
Ahh... Så forstår dit eksempel bedre.
Tester ASAP
Avatar billede wolfgang Praktikant
24. februar 2006 - 11:07 #9
Det virker 100% - fornemt!
Lig venligst et svar - så du kan modtage points.

Har du lyst til at komme med et bud på hvordan at jeg kan loope linjerne fra linje 8 og til slut, igennem i de 3 kategorier.

Kunne man ikke bruge variablen Antal målinger pr. kategori til at sætte endnu en løkke ind i rutinen?

Håber du vil hjælpe.
Avatar billede softspot Forsker
24. februar 2006 - 11:20 #10
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
Avatar billede softspot Forsker
24. februar 2006 - 11:22 #11
...og hvis der kun er 7 linier header, så skal du lige konsekvensrette de steder hvor headeren læses og array'et til at holde headeren defineres.
Avatar billede wolfgang Praktikant
24. februar 2006 - 12:07 #12
Jeg vil afteste det ASAP og vende tilbage.
Det bliver desværre nok først i weekenden :(

Tak for hjælpen indtil nu - jeg vender tilbage.
Avatar billede softspot Forsker
24. februar 2006 - 12:10 #13
no problem - jeg skal nok lade være med at slette min profil i mellemtiden... ;-)
Avatar billede wolfgang Praktikant
24. februar 2006 - 12:49 #14
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
   
    var1 = left(Header(0),8) 'Dato
    var2 = right(Header(0),8) 'Klokkeslet
    var3 = Header(2)
   
      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 ------------------------
Avatar billede softspot Forsker
24. februar 2006 - 12:54 #15
Jeg takker for point :)
Avatar billede wolfgang Praktikant
27. februar 2006 - 11:53 #16
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.

Håber du kan hjælpe mig?
Avatar billede softspot Forsker
27. februar 2006 - 14:20 #17
Hvor laver du rent faktisk insert henne, for jeg kan ikke se at du bruger var2 i den sidste kode du postede...?
Avatar billede softspot Forsker
27. februar 2006 - 14:25 #18
...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:

var2 = dateAdd("s", 1, var2)
Avatar billede wolfgang Praktikant
27. februar 2006 - 15:25 #19
Takker!
For at gøre det rigtige, har jeg oprettet et nyt spørgsmål på exp.dk

På den måde kan jeg tildele nogle point for arbejdet.

Se venligst: http://www.eksperten.dk/spm/691293
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