Avatar billede gargazol Nybegynder
09. marts 2006 - 08:59 Der er 24 kommentarer og
1 løsning

Redigering af tekst fil

Jeg skal lave en metode der kan finde en/flere linie(r) i en tekst fil, og erstatte den/dem med en anden.

Det problem jeg har er at den (nok pga bufferen) skriver den nye linie senere i dokumenten end den skal være.

FileStream fs = new FileStream(fpath, FileMode.Open, FileAccess.ReadWrite);
StreamReader reader = new StreamReader(fs);
StreamWriter writer = new StreamWriter(fs);
string line;
while ((line = reader.ReadLine()) != null)
{
    if (line.IndexOf(checkString) != -1)
    {
        line = newString;
    }
    writer.WriteLine(line);
    writer.Flush();
}
reader.Close();
writer.Flush();
writer.Close();

Jeg vil selv mene at det er den mest efektive måde(når det virker) at gøre det på. Lige mens jeg prøver at få det til at virke bruger jeg:

FileStream fs = new FileStream(fpath, FileMode.Open, FileAccess.ReadWrite);
StreamReader reader = new StreamReader(fs);
StreamWriter writer = new StreamWriter("C:\\fil.tmp");
string line;
while ((line = reader.ReadLine()) != null)
{
    if (line.IndexOf("gargazol") == -1)
    {
        writer.WriteLine(line);
    }
}
reader.Close();
writer.Flush();
writer.Close();
           
File.Delete("C:\\fil.lua");
File.Move("C:\\fil.tmp", "C:\\fil.lua");
File.Delete("C:\\fil.tmp");

Det er så ikke godt med store filer da det jo kræver den dobbelte diskplads, og jeg tror det er noget langsommere (10MB/s på denne pc)

Kan i give mig en læsning til at få erstattet linien det rigtige sted i filen?
Avatar billede gargazol Nybegynder
09. marts 2006 - 09:01 #1
Kan man ikke redigere sine kommentarer/spørgsmål et sted?
Avatar billede the_party_dog Nybegynder
09. marts 2006 - 09:21 #2
Desværre... Man kan kun re-poste sine ændringer, enten som et nyt spørgsmål eller lave et indlæg her i dit spørgsmål, og skrive dine ændringer..

Nu er jeg ikke lige super haj til fil editering, men jeg har da lavet nogle små ting i det og har aldrig oplevet at min linje kommer ind senere i filen..

Hvor store filer roder du rundt i?
Avatar billede gargazol Nybegynder
09. marts 2006 - 09:25 #3
Pt er det meget små filer (under 1MB) men jeg vil gerne have det best mulige, istedet for at bruge en nødløsning, og filerne bliver nok størere engang.

Det jeg oplever er at readeren tager jo 1024 tegn af gangen fra streamen(min idé af hvad der sker) og writeren skriver så der hvor den slap.
Avatar billede the_party_dog Nybegynder
09. marts 2006 - 09:32 #4
Hvis du ikke har fået hul igennem, vender jeg tilbage her i eftermiddag/aften.

Så vil jeg lige se om jeg får samme problem, ved at rode i større filer end normalt.

Men din idé lyder ikke som et dårlig argument for hvad der kan være galt.
Avatar billede gargazol Nybegynder
09. marts 2006 - 09:35 #5
Jeg ER løbet tør for idéer, så jeg er klar til at få en løsning på problemmet.
Avatar billede the_party_dog Nybegynder
09. marts 2006 - 09:37 #6
Okay... Jeg hopper lige ud i det så :)

Genere lige en tekst fil på din størrelse, og prøver at rode med det..
Avatar billede gargazol Nybegynder
09. marts 2006 - 09:38 #7
Glæder mig allerede
Avatar billede the_party_dog Nybegynder
09. marts 2006 - 09:40 #8
Lige for at jeg laver det rigtigt, er alle dine linjer så nogler SUPER lange linjer, med masser af tegn?

Reader.ReadLine() læser (så vidt jeg ved) frem til næste enter.
Avatar billede gargazol Nybegynder
09. marts 2006 - 09:42 #9
Tror min pt længste linie er 80 tegn
Avatar billede the_party_dog Nybegynder
09. marts 2006 - 09:54 #10
Efter en hurtig test, får jeg nu samme resultat som dig. Så du er ikke helt alene...

Jeg knokler lige videre med det, ville bare lige vise dig at du ikke skal slå dig selv alt for hårdt i hovedet... :-)
Avatar billede gargazol Nybegynder
09. marts 2006 - 09:55 #11
hehe, så beholder jeg en smule af håret ;)
Avatar billede the_party_dog Nybegynder
09. marts 2006 - 10:20 #12
Efter at have rodet med at kigge en fil og prøve på at lave om på noget bestemt, lige som dit problem lød på, må jeg sige at jeg er forundret.

Jeg oplever lige nøjagtig det samme som dig. Jeg har læst flere sider, hvor de ikke anbefalder at man editere på den samme fil som man læser i. Alle laver temp filer, for at ændre deres navn.

http://www.codecomments.com/archive291-2004-5-189211.html

Jeg tror jeg skal bruge mere tid for at hjælpe dig videre... Det her kræver tid til at læse og forstå nogle ting mere dybe gående...
Avatar billede gargazol Nybegynder
09. marts 2006 - 10:28 #13
Ja, jeg havde godt set den tråd da jeg selv søgte på emnet, men havde da håbet at en af jer lige lå inde med en smart løsning :)
Avatar billede the_party_dog Nybegynder
09. marts 2006 - 10:32 #14
Det hjælper heller ikke at lige noget sleep ind på den tråd som håndtere selve udlæsning og skrivning. Havde håber på at at selve systemet måske så havde skrevet bufferens indhold ned i filen mens tråden sov...

Så jeg må nok sige at du skal lave temp filer, og rename...
Avatar billede gargazol Nybegynder
09. marts 2006 - 13:16 #15
Andre der har forslag til hvordan det kan gøres best/hurtigst muligt?
Avatar billede arne_v Ekspert
09. marts 2006 - 13:46 #16
det er ulempen ved tekst filer !

skift til database (eller hvis du er til klassisk teknologi noget
binært ISAM fil ...)
Avatar billede gargazol Nybegynder
09. marts 2006 - 13:51 #17
Problemmet er bare det ikke er mig selv der laver text filerne jeg skal redigere i.

Tjaa, ser ud til min alternative metode er den eneste der virker. Jeg siger tak for forsøg på at hjælpe.

ps. Hvis der lige pludselig er en der finder en løsning, så skriv endelig.
Avatar billede arne_v Ekspert
09. marts 2006 - 17:11 #18
behoever du arbejde paa original filerne ?

kan du ikke arbejde paa en kopi af data som du har loadet ind i en database
eller andet og saa eventuelt eksportere derfra naar det er helt faerdigt ?
Avatar billede gargazol Nybegynder
09. marts 2006 - 19:02 #19
Jo, det kan jeg da godt, så længe der bare er performance fordel ved det.

På den anden side aner jeg intet om databaser, dog kan det self være på tide at lære det :)
Avatar billede arne_v Ekspert
09. marts 2006 - 19:36 #20
hvis der kun skal rettes en gang i hver fil vinder du ikke noget ved det (andet end at
du maaske kan vaelge tidspunkt for opdatering)

hvis filen skal opdateres flere gange og databasen struktueres fornuftigt
vil du kunne opnaa meget store performance forbedringer
Avatar billede gargazol Nybegynder
09. marts 2006 - 23:23 #21
Lyder som om det bliver for stort til det småteri jeg skal bruge det til lige nu.

Planen var ca. 10-100 linier der skulle rettes/slettes, så lyder ikke som om database er valget til det småtteri.

Jeg takker for forslagene og hvis i begge ligger et svar får i da delt points som tak for alt hjælpen, selvom det ikke lige faldt ud som jeg havde håbet :)
Avatar billede arne_v Ekspert
10. marts 2006 - 01:41 #22
det er ikke antal linier som skal rettes der betyder noget men den samlede
stoerrelse
Avatar billede gargazol Nybegynder
10. marts 2006 - 01:50 #23
Som projektet er pt, kommer filen nok aldrig over 1MB, det var mere til senere brug jeg ville have noget efektivt der.
Avatar billede the_party_dog Nybegynder
10. marts 2006 - 07:52 #24
Et kort svar. Mener ikke jeg har fortjent noget, men du styrer du selv :-) Held og lykke med det hele.
Avatar billede gargazol Nybegynder
10. marts 2006 - 12:24 #25
Tjoo, i har forsøgt begge at hjælpe mig, kommet med gode forslag/testet mine, så kan ikke se hvorfor mine points skal ligge her og flyde :)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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