Avatar billede dragnor Juniormester
15. januar 2007 - 13:56 Der er 29 kommentarer og
1 løsning

kontrollere og ret linje i txt fil

Hej eksperter

Jeg sidder med en txt fil hvor der fek. er 1000 forskellige linjer. Men det de har til fælles er at de alle er bygget ens op.

Eksempel på en linje:

23707    ;2695312  ;SELECTR;S;S;Y;TDK    ;800006249 ; 6;16/12/06;T8017  ;457203145963    ;SAGEM60;08/01/07


Det jeg søger er noget kode hvor jeg kan trække en linje ud af gangen, og knotrollere at der er 13 skille tegn altså ";". hvis der ikke er 13 ; i en linje skal den slette den fra txt filen.

Er der nogen der kan hjælpe med det?
Avatar billede bitmatic Nybegynder
15. januar 2007 - 14:10 #1
Skal den læse en linie ad gangen, eller må det godt læse alle linierne ind, inden den begynder at tjekke for om linierne er ok ?

Hvis du har RAM til at læse hele lortet ind, og så løbe det igennem og fjerne de forkerte linier, så er det pærelet.
Avatar billede kalp Novice
15. januar 2007 - 14:21 #2
utestet, men der skal maks små rettelser til vil jeg mente..


try
{

string nyfil = "";
string gamle = "";

           
  Textreader tr = new StreamReader("dinfil.txt");
  gamle = gamle = ReadToEnd();
            tr.Close();
           
            File.Delete("dinfil.txt");
           
            TextWriter tw = new StreamWriter("dinfil.txt");

            string[] linjer = gamle.Split(new Char [] {'\n'});
            for(int i = 0; i < linjer.Length; i++)
            {
            string[] count = linjer[i].Split(new Char [] {';'});
            if(count.Length = 13)
            nyfil += linjer[i];
            }

            tw.WriteLine(linjer);
            tw.Close();
        }
        catch{}
Avatar billede kalp Novice
15. januar 2007 - 14:22 #3
tilføj dette i toppen

using System;
using System.IO;
Avatar billede kalp Novice
15. januar 2007 - 14:24 #4
lav lige en ekstra kopi af din fil;o)
Avatar billede kalp Novice
15. januar 2007 - 14:35 #5
if(count.Length = 13)
{
            nyfil += linjer[i];
nyfil += "\n";
}

tjah.. man kan selv se småting.. men virker det?
Avatar billede dragnor Juniormester
15. januar 2007 - 14:45 #6
Textreader og ReadToEnd giver problemer for min compiler i visual studio
Avatar billede kalp Novice
15. januar 2007 - 14:52 #7
TextReader
Avatar billede dragnor Juniormester
15. januar 2007 - 14:54 #8
mit resultat bliver at 1000 linjer forsvinder og så står der kun System.String[]
Avatar billede kalp Novice
15. januar 2007 - 14:56 #9
try
{

string nyfil = "";
string gamle = "";

           
  TextReader tr = new StreamReader("dinfil.txt");
  gamle = ReadToEnd();
            tr.Close();
       
            File.Delete("dinfil.txt");
           
            TextWriter tw = new StreamWriter("dinfil.txt");

            string[] linjer = gamle.Split(new Char [] {'\n'});
            for(int i = 0; i < linjer.Length; i++)
            {
            string[] count = linjer[i].Split(new Char [] {';'});
            if(count.Length = 13)
            nyfil += linjer[i].ToString();
            }

            tw.WriteLine(nyfil);
            tw.Close();
        }
        catch{}
Avatar billede kalp Novice
15. januar 2007 - 14:57 #10
arghh.. glemte lige at dette skal være med igen..

så denne

try
{

string nyfil = "";
string gamle = "";

           
  TextReader tr = new StreamReader("dinfil.txt");
  gamle = ReadToEnd();
            tr.Close();
       
            File.Delete("dinfil.txt");
           
            TextWriter tw = new StreamWriter("dinfil.txt");

            string[] linjer = gamle.Split(new Char [] {'\n'});
            for(int i = 0; i < linjer.Length; i++)
            {
            string[] count = linjer[i].Split(new Char [] {';'});
          if(count.Length = 13)
{
nyfil += linjer[i].ToString();
nyfil += "\n";
}
            }

            tw.WriteLine(nyfil);
            tw.Close();
        }
        catch{}
Avatar billede kalp Novice
15. januar 2007 - 15:17 #11
hjalp det?
Avatar billede hmortensen Nybegynder
15. januar 2007 - 15:53 #12
if(count.Length = 13)
skal vel være
if(count.Length == 13)
Avatar billede kalp Novice
15. januar 2007 - 15:58 #13
rigtigt=) jeg skriver i notepad så det er som sagt ikke utestet.. regner med spørger har lidt kendskab selv forhåbentlig
Avatar billede hmortensen Nybegynder
15. januar 2007 - 16:00 #14
Ikke utestet? ;)

Ud over det, burde man nok bruge en StringBuilder til så mange linier.
Avatar billede arne_v Ekspert
15. januar 2007 - 17:25 #15
ja !

og hvorfor holde det hele i memory ?
Avatar billede arne_v Ekspert
15. januar 2007 - 17:27 #16
(i memory i 3 kopier)
Avatar billede kalp Novice
15. januar 2007 - 17:44 #17
jeg synes det var hurtigst at kode:)

og så synes jeg desuden det lød som en løsning der skal benyttes en enkelt gang på en fil hvor man ikke gider gøre arbejdet manuelt.
Avatar billede dragnor Juniormester
16. januar 2007 - 12:19 #18
Undskyld at jeg ikke lige fik svaret dig, tester det nu og så skal du nok få svar
Avatar billede dragnor Juniormester
16. januar 2007 - 12:28 #19
nej den skriver stadigvæk kun System.String[] i txt filen
Avatar billede -mundi- Nybegynder
16. januar 2007 - 12:46 #20
Her testet med:
23701    ;2695312  ;SELECTR;S;S;Y;TDK    ;800006249 ; 6;16/12/06;T8017  ;457203145963    ;SAGEM60;08/01/07
23702    ;2695312  ;SELECTR;S;S;Y;TDK    ;800006249 ; 6;16/12/06;T8017  ;457203145963    ;SAGEM60;08/01/07
23703    ;2695312  ;SELECTR;S;S;Y;TDK    ;800006249 ; 6;16/12/06;T8017  ;457203145963    ;SAGEM60;08/01/07
23704    ;2695312  ;SELECTR;S;S;Y;TDK    ;800006249 ; 6;16/12/06;T8017  ;457203145963    ;SAGEM60;08/01/07
23705    ;2695312  ;SELECTR;S;S;Y;TDK    ;800006249 ; 6;16/12/06;T8017  ;457203145963    ;SAGEM60;08/01/07
23706    ;2695312  ;SELECTR;S;S;Y;TDK    ;800006249 ; 6;16/12/06;T8017  ;457203145963    ;SAGEM60;08/01/07
23707    ;2695312  ;SELECTR;S;S;Y;TDK    ;800006249 ; 6;16/12/06;T8017  ;457203145963    ;SAGEM60;08/01/07
2370(    ;2695312  ;SELECTR;S;S;Y;TDK    ;800006249 ; 6;16/12/06;T8017  ;457203145963    ;SAGEM60;08/01/07;
23709    ;2695312  ;SELECTR;S;S;Y;TDK    ;800006249 ; 6;16/12/06;T8017  ;457203145963    ;SAGEM60;08/01/07

string srcpath = @"c:\exp.txt";
        string tempname = @"c:\"+ Guid.NewGuid().ToString() + ".txt";
        StreamReader o = new StreamReader(srcpath);
        StreamWriter t = new StreamWriter(tempname,false);

        while(!o.EndOfStream) {
            string line = o.ReadLine();
            string[] tmp = line.Split(';');
            if(tmp.Length==14) //der er præcis 13 semikolonner, derfor splittes linien i 14 dele
                t.WriteLine(line);
        }
        o.Close();
        t.Close();

        File.Delete(srcpath);
        File.Move(tempname, srcpath);
Avatar billede -mundi- Nybegynder
16. januar 2007 - 12:47 #21
using System;
using System.IO;
Avatar billede dragnor Juniormester
16. januar 2007 - 13:08 #22
fik det til at virke, der skulle stå 14 istedet for 13. da deb ikke tælle tegn men antal udfyldte poster i []
Avatar billede dragnor Juniormester
16. januar 2007 - 15:28 #23
Lige en hurtig ting, hvorfor laver den et linjeskift (tom linje) til sidst i txt filen? Den skulle helst ikke være der!
Avatar billede dragnor Juniormester
16. januar 2007 - 15:30 #24
mit resultat af koden:

try
            {

                string nyfil2 = "";
                string gamle2 = "";


                TextReader tr2 = new StreamReader("C:\\TEMP\\Hardware.txt");
                gamle2 = tr2.ReadToEnd();
                tr2.Close();

                File.Delete("C:\\TEMP\\Hardware.txt");

                TextWriter tw2 = new StreamWriter("C:\\TEMP\\Hardware.txt");

                string[] linjer2 = gamle2.Split(new Char[] { '\n' });

                for (int j = 0; j < linjer2.Length; j++)
                {
                    string[] count2 = linjer2[j].Split(new Char[] { ';' });

                    if (count2.Length == 14)
                    {
                        if (j == linjer2.Length-1)
                        {   
                            nyfil2 += linjer2[j].ToString();
                        }
                        else
                        {
                            nyfil2 += linjer2[j].ToString();
                            nyfil2 += "\n";
                        }
                    }
                   
                }
               
                tw2.WriteLine(nyfil2);
                tw2.Close();

                MessageBox.Show("Færdig, og alt er i orden");
               
            }
            catch { }
Avatar billede dragnor Juniormester
16. januar 2007 - 15:30 #25
Men hvorfor en ekstra tom linje til sidst i txt filen?
Avatar billede kalp Novice
16. januar 2007 - 15:32 #26
if(linjer[i].ToString().Trim() != "" || linjer[i].ToString() != "\n")
{
nyfil += linjer[i].ToString();
nyfil += "\n";
}

prøv at lave et tjek som det der.
Avatar billede dragnor Juniormester
16. januar 2007 - 15:41 #27
Jeg har fundet ud af at det er tw2.WriteLine(nyfil2); funktionen der gør det. For hvis jeg udskriver teksten i en richtextbox så er der ikke noget linjeskift, mærkeligt!
Avatar billede kalp Novice
16. januar 2007 - 16:13 #28
WriteLine laver en ny line.. Write gør ikke
Avatar billede dragnor Juniormester
16. januar 2007 - 17:13 #29
1000 tak, det var bedre!!!
Avatar billede kalp Novice
16. januar 2007 - 17:24 #30
selv tak:)
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