04. november 2002 - 14:55Der er
19 kommentarer og 1 løsning
Undersøg, og evt. skriv til txt filer
Lige nu har jeg et program, som læser fra forskellige txt filer. Disse text filer er skrevet linje for linje (med '0' eller '1' på diverse linjer) (Jeg ved...ikke specielt professionelt, men jeg er heller ikke pro...)
Problemet er at jeg af og til add'er noget til programmet, som så skal have en ny linje i txt filen, men jeg vil gerne have et program, som autmatisk læser alle filerne igennem (Jeg vil regne med at der ca. er 2-300 txt filer), ser efter om en txt fil, mangler noget info (Som f.eks om det står noget på linje 6 eller ej, hvilket er det linjenr. jeg er nået til nu), hvis der ikke står noget i det felt (dvs. at sidste linje er tomt, så der læses past End of File), så skal der skrives '0' på den linje (altså det skal gemmes i txt filen)
Jeg ved ikke helt hvor jeg skal smide det...om det skal være i programmet, eller om jeg skal lave et nyt (omkonventerings) program...jeg gætter på at det bliver sidst-nævnte...
Hvad med at lave en filelistbox, og løbe alle filerne igennem, læser hver fil linie for linie og så gør det du nu vil gøre hvis dit og dat er opfyldt:
dim i as integer dim Filnavn as string dim Filnummer as integer dim Linie as string 'Looper gennem alle filer vist i filelistboxen (smid evt. en DriveListBox og en dirlistbox på din form, så man kan vælge hvilken mappe der skal tages filer fra...) For i=0 to file1.count -1
'Finder filnavn på aktuel fil (dvs. fil nummer "i") If Right(Dir1.Path, 1) = "\" Then Filnavn = Dir1.Path & File1.List(i) Else Filnavn = Dir1.Path & "\" & File1.List(i) End If
'Åbner filen til læsning (for skrivning, brug Output ikke input) Filnummer= Freefile Open Filnavn For input As #Filnummer
'Læser filen linie for line Do While Not EOF(Filnummer) Line Input #Filnummer, Linie if mid(ltrim(linie),1,1) = "6" then msgbox "hurra, der står 6 i filen " & filnavn 'Bla bla - gør hvad du nu skal gøre... end if Loop
close filnavn next i
Smider du en Drivelistbox og en dirlistbox på din form også, får du dem til at "snakke sammen" ved følgende kode:
Private Sub Drive1_Change() Dir1.Path = Drive1.Drive End Sub
Private Sub Dir1_Change() File1.Path = Dir1.Path End Sub
Du kan sætte et filepattern på din file1 ved File1.Pattern = "*.txt"
Du ved godt, at VB selv angiver alle muligheder selv - Hvis du skriver list1 og et punktum, kommer der en lilkle boks op - der kan du se hvad man kan vælge... Jeg huskede forkert, og troede det hed count - jeg har ikke lige VB her til at hjælpe mig med mulige forslag :o)
Ok, det virker så...men nu har jeg et andet problem...jeg kender ikke lige betydningen af: (dvs, jeg kender if then...men Mid(LTrim... er ikke noget jeg kender...kunne du prøve at forklare det?)
If Mid(LTrim(Linie), 4, 1) = "" Then
Jeg troede at det første tal var linjenr. og det andet tal var længden inde i linje...men så bliver den ved med at vise msg boxen, selvom der står noget i det felt...Kører jeg den anden vej, og siger at det første tal er hvor langt inde i linjen, osv, så viser den aldrig msg boxen...
Hmm - jeg kan se, at du måske kunne få gavn af ledt mere forklaring:
Do While Not EOF(Filnummer) '<- Fortsætter til EOF nås Line Input #Filnummer, Linie '<- Læser en NY linie - hver gang denne kode udføres, ' indlæses den næste linie i text-filen ind i variablen "Linie"
if mid(ltrim(linie),1,1) = "6" then '<- Hvis første tegn i den aktuelle linie er "6" så... msgbox "hurra, der står 6 i filen " & filnavn 'Bla bla - gør hvad du nu skal gøre... end if Loop
Ok, tak for forklaringen, dog er det nok ikke det som jeg skal bruge så, da mine txt filer ser således ud: (den gamle) (for at give et eksempel)
0 1 3 0 5
Tallene er tilfældige, men alle tal der bruges, kan dukke op flere gange i en txt fil...Det den så skal gøre er at se efter om der står noget i linje 6 (hvilket det ikke gør i det "gamle" filer), vis der IKKE står noget i linje 6, så skal den så udføre den der kode til at skrive '0' på linje 6
Jamen så skriver jeg svaret lidt om - jeg troede du ville noget andet:
dim i as integer dim j as integer ' <- NY dim LinieArray() as string '<- NY Array (tabel) med linier i dim Filnavn as string dim Filnummer as integer dim Linie as string
For i=0 to file1.count -1 If Right(Dir1.Path, 1) = "\" Then Filnavn = Dir1.Path & File1.List(i) Else Filnavn = Dir1.Path & "\" & File1.List(i) End If Filnummer= Freefile Open Filnavn For input As #Filnummer j=0 ' <- NY Do While Not EOF(Filnummer) Line Input #Filnummer, liniearray(j) '<- NY Læser linier ind i array j=j+1 'j = linienummer ' <- NY Loop close filnummer 'Hvis j < 6 er der under 6 linier i filen - herfra er alt vist nyt:
if j < 6 then Filnummer= Freefile Open Filnavn For output As #Filnummer ' <- Bemærk, at der står Output! for j=lbound(liniearray) to ubound(liniearray) Print #FilNummer, liniearray(j) '<-Skriver linier til filen igen next j Print #FilNummer, "0" '<- tilføjer en ny linie i filen end if next i
Som før - jeg har ikke lige VB, så der kan optræde en lille stavefejl hist og pist - men mon ikke du fanger ideen, som er:
1) Åben filen for læsning, læs alle linier ind i et array og luk filen 2) Tjek hvor mange linier der var i filen 3) Var der under 6 linier åbnes filen for SKRIVNING og overskrives med linierne fra arrayet - på det punkt er filen bare "genskabt" 4) Der TILFØJES en ekstra linie i filen
Af det af koden, som jeg kender, så ser det rigtigt ud, og det ser ikke ud til at være nogen stavefejl, men den bliver ved med at skrive "subript out of range" til denne linje:
Jo du kan - du går bare tilbage til VB når fejlen kommer...
Jeg har lige fået fat i en anden PC, for det her kan jo ikke blive ved. Der var stadig et par småfejl i min kode, så jeg har skrevet den lidt om så den virker nu (og ER testet for første gang;o)
PS: Grunden til at du får fejlen er, at arrayet ikke er blevet dimensioneret - derfor kan du ikke kalde posten LinieArray(0)...
Her er koden - copy, paste, vær glad og spørg hvis der er noget du ikke forstår:
Private Sub Command1_Click() Dim i As Integer Dim j As Integer ' <- NY Dim LinieArray() As String '<- NY Array (tabel) med linier i Dim Filnavn As String Dim Filnummer As Integer Dim Linie As String
For i = 0 To File1.ListCount - 1
'Finder filnavn If Right(Dir1.Path, 1) = "\" Then Filnavn = Dir1.Path & File1.List(i) Else Filnavn = Dir1.Path & "\" & File1.List(i) End If
'Tæller antal linier i filen Filnummer = FreeFile Open Filnavn For Input As #Filnummer j = 0 Do While Not EOF(Filnummer) Line Input #Filnummer, Linie j = j + 1 Loop Close Filnummer
'Redimensionerer arrayet til at indeholde fra 0 til j pladser ReDim LinieArray(j)
'Indlæser i array Filnummer = FreeFile Open Filnavn For Input As #Filnummer j = 0 Do While Not EOF(Filnummer) Line Input #Filnummer, LinieArray(j) j = j + 1 'j = linienummer ' <- NY Loop Close Filnummer
'Skriver fra array til fil og tilføjer ny linie If j < 6 Then Filnummer = FreeFile Open Filnavn For Output As #Filnummer For j = LBound(LinieArray) To UBound(LinieArray) - 1 Print #Filnummer, LinieArray(j) Next j Print #Filnummer, "0" MsgBox "Der blev skrevet til filen " & Filnavn End If Close Filnummer
PS: Når fejlen kommer LIGE når programmet starter, må det være fordi du har lagt koden i f.x. Form_Load. Det er måske ikke HELT så smart, mon ikke hellere du skulle lægge koden i en Command1_Click...
Men kort og godt: Det virker nu, så tak for hjælpen
Grunden til at den kører koden fra start, er at det er programmets eneste funktion, efter fuldendt opdatering lukkes programmet ned igen, så det eneste man ser, er en MsgBox som siger at filerne er opdateret
Jeg brugte drive1 og dir1 til at tjekke om jeg nu også havde skrevet det rigtige bibliotek :o)
Synes godt om
Ny brugerNybegynder
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.