Gå til innhold

C#: Fjerne blanks i starten av hver linje


Anbefalte innlegg

har du prøvd å bruke ReadBlock() eller ReadToEnd()? bare for å ha noe å sammenlikne med ytelsesmessig, så søkte jeg nettopp gjennom bibelen (30 383 linjer) etter en frase, og det tok 5ms. Så noen tusen linjer burde gå rimelig fort å søke gjennom hvis det er gjort riktig.

Det er noe kode inni loopen også, så muligens dette som sakker. Den bruker ca 15 sek per MB med tekst.

while ((line = file.ReadLine()) != null)
               {
                   if (counter == 0)
                       forstelinje.Text = line; //Plukker ut første linje

                   sistelinje.Text = line; //Skifter ut sistelinje-boksen med aktuell linje

                   if (line == "")
                       tomme++;//Teller tomme linjer
                   counter++;//Teller linjer
                   if (line.Length >= 3)
                   {
                       if (line.StartsWith(_forstetegn))
                           _ind1++;
                       if (line.StartsWith(_sistetegn))
                           _ind2++;
                       if (line.Length > 120)
                       lengdefeil = true;
                   }   
               }

-ind1 og ind2 teller forekomster av _forstetegn og _sistetegn som det må være like mange av (kontrollerer dette etter loopen)

-ellers så er det litt klønete den måten jeg fyller inn sistelinje.text på - den er til en hver tid den siste leste linja. Finnes det mer effektive måter å plukke ut den siste på?

 

-og et helt annet problem: mellom hver fil jeg analyserer vil jeg tømme en temp-mappe, men noen ganger står det at en fil er i bruk. det er bare mitt program som bruker filen, så hvordan jeg hindre at den er med i en aktiv prossess? Nåværende kode for dette:

            foreach (string file in System.IO.Directory.GetFiles(_mappe+@"tmp\", "*.*", SearchOption.AllDirectories))
           {
               File.SetAttributes(file, FileAttributes.Normal); //Fjerner evt skrivebeskyttelse
               File.Delete(file);
           }

Lenke til kommentar
Videoannonse
Annonse

Dette er usedvanlig komplisert kode for noe såpass enkelt.

 

Uansett, les hele filen inn i minnet med ReadToEnd eller System.IO.File.ReadAllText.

 

Deretter leter du etter newline. Her ligger også et problem som ingen har adressert enda, Windows bruker CrLf som er lik \r\n (Environment.NewLine) dette er noe idioti som henger igjen fra skrivemaskindagene (Carriage Return, Line Feed) men du kan også komme borti filer som bruker kun \n som er standard i Unix.

Eksempelvis kunne ikke gamle notepad versjoner lese Unix filer på en skikkelig måte uten å legge all teksten på en linje og vise \n som en firkant.

 

En kan derfor ikke bruke replace("\n\n", "\n") fordi teksten vil ikke nødvendigvis inneholde "\n\n"

 

Men til det andre problemet, du er ute etter å lete binært etter teksten din igjennom stringen, et problem er at første linje ikke starter med "\n" eller "\r\n" så du kan ikke lete etter "\nabc" eksempelvis. Du kan derimot legge til et unntak for dette, men det skal ikke være nødvendig. Det er derimot også mulig å bruke Regex for å lete, siden denne allerede behandler linjeskift på en korrekt måte.

"^abc" vil lete etter "abc" som er i begynnelsen av hver linje. Den burde være rask (siden regex kan kompileres til .NET) og være lett å endre dersom det skulle bli nødvendig.

Prøv å kun initialisere regex objektet én gang, og med Compiled skrudd på, slik at det ikke gjøres hver gang funksjonen kjøres.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...