15. februar 2001 - 08:50Der er
14 kommentarer og 1 løsning
Ændre textfil via kode...
Hejsa
Er der nogen der ved hvordan man ændre en tekstfil via kode ?
Det jeg er ude efter er at kunne ændre en linie midt i filen - altså erstatte hele linien med en ny.
Jeg ved godt hvordan jeg tilføjer linier til toppen eller bunden af en fil, men spørgsmålet er hvordan man smider en linie ind midt i filen som erstatning for en anden.
Det må ikke være sådan at jeg smider alle linierne inden den linie der skal ændres ind i en variabel og det samme med linierne efter for derefter bare at oprette en ny fil og skrive linierne til den i rigtig rækkefølge - det skal være en løsning hvor man direkte erstater én linie med en anden.....
Private Sub cmdStart_Click() ReDim fLines(0) As String
Open \"sowhat.txt\" For Input As #1 Do Until Eof(1) Line Input #1, fLines(UBound(fLines)) ReDim Preserve fLines(UBound(fLines) + 1) As String Loop Close #1
ReDim Preserve fLines(UBound(fLines) - 1) As String
fLines(15) = \"denne linie erstatter linie 16. linie numre sarter ved 0\"
Open \"sowhat.txt\" For Output As #1 For Index = 0 To UBound(fLines) Print #1, fLines(Index) Next Close #1 End Sub
Hmmmm, OK, jeg tror nok jeg forstår, men jeg kan vel ikke lokke dig til at kommentere hvad din løsning gør undervejs - jeg er endnu ikke så stærk i filskrivning/læsning til at jeg kan se det klart for mig....
hmmmm, så har jeg gransket den lidt nøjere... er det korrekt at du først læser hele filen ind i en matrix (flines()) dernæst tilpasser man den linie der skal ændres ved at ændre matrixen, for til sidst at fyre hele matrixen ned i filen på ny. ?
Det er selvfølgelig en lidt fancy\'er måde at gøre det på, men principielt vel nøjagtig det samme som jeg beskrev, med at proppe linierne før og efter i variabler og så skrive til filen på ny ?
Nå, ja - men kan det ikke lade sig gøre, så kan det ikke lade sig gøre :-)
Du ved ikke om man kan løse dette problem ved at lave en sammenkædet tabel i Access f.eks. og så ændre i den tabel der kommer ud af det ????
\' Gør et array klar, men uden elementer da ReDim (ReDimension) klarer den. Dim fLines() As String
Private Sub cmdStart_Click() \' ReDim array\'et til 0 elementer (dvs. 1 linie) ReDim fLines(0) As String
\' Åben filen \"sowhat.txt\", så vi kan læse den Open \"sowhat.txt\" For Input As #1
\' Loop indtil vi er ved enden af filen (EOF = EndOfFile) Do Until Eof(1)
\' Læs en hel linie in i det største mulige element # i arrayet. UBound() = Upper Bound Line Input #1, fLines(UBound(fLines))
\' ReDim array\'et til største mulige element+1 så der er plads til en linie mere. ReDim Preserve fLines(UBound(fLines) + 1) As String Loop
\' Luk filen Close #1
\' Da der altid vil være et element mere end der er brug for, så ReDim\'er \' vi array\'et til srøste element-1. ReDim Preserve fLines(UBound(fLines) - 1) As String
\' Her kan du frit lave om på de forskellige linie vha. deres linie nr. -1. Dvs. linie 1 har \' element nr. 0. fLines(15) = \"denne linie erstatter linie 16. linie numre sarter ved 0\"
\' Åben filen \"sowhat.txt\" så vi kan skrive til den (Output) Open \"sowhat.txt\" For Output As #1
\' Loop fra 0 til det største mulige element i array\'et For Index = 0 To UBound(fLines)
\' Skriv hver enkelt linie til filen igen Print #1, fLines(Index) Next
det er godtnok ikke et matrix, da et matrix er et 2 dimensionelt array (dvs. f.eks. Dim myarray(10, 12) hvor du så f.eks. har x aksen på 11 elementer og y med 13) men anyway, det her er den eneste måde at gøre det på, og hvis du vil til at bruge en Access database (hvorfor ved jeg ikke, da jeg ikke kan se fordelen..) så vil det bare sløve programmet ned...
ER det så muligt at oprette et recordset eller lign. fra VB direkte til TXT filen, så man ville kunne gøre til en Access database, og så tilføje og ændre til TXT filen igennem recordsetet ????
Det anede mig, men jeg ville lige udtømme hver en kilde....
Din løsning kan sagtens bruges, jeg ville bare have foretrukket ikke at skulle overskrive HELE filen ved hver en ændring - men hva\' større problem er det heller ikke - det er bare når man har en idé - så har den død og pine også bare at kunne lade sig gi\' sig - kender du det ? :-)
Nå, men tak for hjælen t - jeg har erkendt at der ikke er noget at gøre, så jeg array\'er den :-)
Nu er sagen jo afsluttet, men jeg benytter ascii-filer som databaser og anvender to filer til en sådan operation. Jeg læser alle linier en for en over i en ny fil. Når jeg når til den jeg ændrer læses ikke fra primær-filen med fra tekst-boksen, resten læses fra fil ét.
Efterfølgende kopierer jeg fil to oveni fil ét med FileCopy.
Hvor store er filerne? Med 10.000 linier tager det mindre tid end at sige \'tetid igen\'. Ram bruges der ikke noget af, arrays er unødvendige, bare én variabel til hver linie, der vel er på under 64 k tegn.
Det var da egentlig en meget interesant tanke - men som t nævner så kræver det en midlertidig fil der skal slettes osv. og det er jeg ikke interesseret i p.t.
Midlertidig fil? dræb den! Kill minfil.bak Jeg melder mig ud af spørgsmålet nu.
m.v.h. Jørn
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.