Laden...

Forenbeiträge von LaBoLe Ingesamt 10 Beiträge

24.11.2008 - 21:22 Uhr

So naoch mal Hallo

ich hab mich jetzt aufgrund der Datenmengen im Speicher für ein eine Mini-Datebang in form von DLL enschieden. Das ist wehsendlich schneller und eifacher zu handhaben als die riesigen list<sammler>.

Dafür benutze ich den "FireBird embed 2.1.1" üder ado.NET.

Wollte erst den MSSQL oder MySQL nehmen aber dann später beim Nutzer noch so Serverprogramme zu installieren finde ich irgendwie unsinnig.

Ach ja, auf die Idee hat mich euer Forum gebracht. Danke noch mal für alles ^^.

Naja 1,5 Wochen deiner Arbeitszeit ist sicherlich teurer als einer dieser Analyser.

Wieso ich lern ja dadurch auch ne menge. Ich hat mal vor längererzeit ne Weiterbildung für .NET aber ich bin dann nie wieder dazu gekommen alles mal in eigenem Projekt zu verwirklichen wie ichs jetzt tue. Leider merk ich das ich schon wieder de helfte vergessen habe und da kommt das jetzt ganz gut zur Auffrischung.

22.11.2008 - 19:15 Uhr

So ich habe den Fehler endlich gefunden. Ich sag nur so viel wie kleiner Wirkung große Ursachen.

Und zwar ist dafür meine Funktion TimeConv() verantworlich gewehsen. In dieser wird noch mal überprüft ob alle Werte innerhalb der zulässigen Bereiche sind. Genau in ener Überprüfung für Minute stand das Minute nicht kleiner 1 sein darf. Kann sie aber nämlich 0. Aufgefallen ist es mir das er immer nach 59 falsche Zeit anzeigt und als ich bemerkt habe das da die aktuelle Uhrzeit stand, was ich vorher nie gemerkt habe sondern nur auf das Datum geschaut, wusste ich das der Fehler in der TimeConv ist. Diese gibt anstadt fehler now() ausgibt.

Mir is die ganze Zeit die Zeit nicht aufgefallen. Ich depp ankopfklatsch Und ich such hier seit 1,5 Wochen.

Oh ... squids logfile analyzer gibt's sehr viele, man muss kein Programm dafür schreiben großes Grinsen

Ja weis ich auch aber die machen alle nicht das was ich haben will. Und die das machen kosten haufen Schotter für Windows-Server. Also selbst ist der Mann. Außerdem lern ich dann noch besser das C# kennen.

22.11.2008 - 17:11 Uhr

So hab mal diese markanten Stellen über Debuger und HexEditor angeschaut. Also ich kann nichts endeckten wegen LF oder CR.
Aber ich habe gerade Festgestellt das schon viel früher in der Datei solche stellen auftretten die er problem los einliest. Demnach muss es noch eine andere Ursache haben. Die frage is nur welche.

Das is ne LOG vom Squid-Proxy. Ich hab nur Teile unscharf gemacht um keine Werbung oder ähnliches zu machen. Es lebe das Bundesdatenschutzgesetz 😁

22.11.2008 - 16:48 Uhr

Also ich hab jetzt alle eure Tips im Quellcode umgesetzt.
Cool is erstmal das ich nimmer so viel Speicher brauch und etwas schneller ist. (vorher ca 150 MB jetzt nur noch so um die 50 MB)

Allrdings is das Problemm immer noch da. Nun hab ich meine Datei mal an der Position wo das Phenomen auf tritt angeschaut. Dort ist eine Zeile so lang das der Editor sie mit zwei Zeilen darstellt. Könnte das der Auslöser sein?

22.11.2008 - 15:52 Uhr

Die Progress is meiner Meinung nach inordnung:


        private void progress(double pos, double max)
        {
            int erg = (int)((pos / max) * 100);
            if (erg != progressBar1.Value) progressBar1.Value = erg;
        }

Das mit dem GetLenght(0) zwischen speicher wäre eine gute Idee. Da hab ich Depp noch nicht dran gedacht. Ich Schachtel immer gerne.

  
Data[i].GET = tmp2[5].Trim('"').ToLower() == "get";  
  

Das man das auch so schreiben kann wusste ich noch nicht. Danke

22.11.2008 - 15:42 Uhr

Doch er durchläuft das ganze wie er soll. Das Program funktioniert.

Das Phenomen ist das er aus der datei:

1
2
3
4
5
6
7
8
9

das hier ausliest:

1
2
3
7
8
9
4
5
6

Sprich er list mitten drinne einen Teil vom ende der datei ein.

Der Sammler ist ein Klasse als Array. Das ist nacher für die weitere Verarbeitung wichtig weil der Sammler noch mehrmals genutzt und geändert wird.

Klassen definition:


    class Sammler
    {
        #region divs
        private string _ip;
        private DateTime _time;
        private bool _get;
        private string _adrShort;
        private string _adrLong;
        private int _code;
        private int _byte;
        #endregion

        #region setter & getter
        public string IP { get { return _ip; } set { _ip = value; } }
        public DateTime Time { get { return _time; } set { _time = value; } }
        public bool GET { get { return _get; } set { _get = value; } }
        public string AdrShort { get { return _adrShort; } set { _adrShort = value; } }
        public string AdrLong { get { return _adrLong; } set { _adrLong = value; } }
        public int Code { get { return _code; } set { _code = value; } }
        public int Byte { get { return _byte; } set { _byte = value; } }
        #endregion
    }

22.11.2008 - 15:20 Uhr

Hallo,

meines Wissens ist " " ein String und ' ' Char. Wenn du mit nur einem Zeichen trenen willst kannst du direckt 'c' an der Funktion eigeben. Bei mehreren Zeichen musst du dann ein char-Array machen und die Variable der Funktion übergeben.

22.11.2008 - 15:09 Uhr

Sorry habs gefunden, logischer Denkfehler meinerseits beim Schreiben.

Habs nun eigenbunden und Quelltext nun dementsprechend angepasst. Nur leider Tritt das Phenomen immer noch auf.


string[] tmp, tmp2;
Sammler[] Data = new Sammler[0];
message("  Einlesen der Daten ...");
            tmp = File.ReadAllLines(textBox1.Text);
            Helper conv = new Helper();
            Data = new Sammler[tmp.GetLength(0)];
            //data = new StreamReader(textBox1.Text);
            for(i=0; i<tmp.GetLength(0); i++) 
            {
                tmp2 = tmp[i].Split(' ');
                Data[i] = new Sammler();
                Data[i].IP = tmp2[0];
                Data[i].Time = conv.TimeConv(tmp2[3].Trim('['));
                Data[i].AdrLong =tmp2[6].Trim('"');
                Data[i].AdrShort = conv.AdrConv(tmp2[6].Trim('"'));
                Data[i].Code = int.Parse(tmp2[8]);
                Data[i].Byte = int.Parse(tmp2[9]);
                if (tmp2[5].Trim('"').ToLower() == "get") Data[i].GET = true; else Data[i].GET = false;
                progress(i, tmp.GetLength(0));
                Console.WriteLine(Data[i].Time.ToShortDateString() + " - " + Data[i].Time.ToShortTimeString());
            }

22.11.2008 - 14:55 Uhr

verwende File.ReadAllLines

Habs grad ausprobiert. Leider scheint das nicht in der Express 2005 drin zu sein. Das einzige was ich finde ist File.ReadToEnd() und hat als rückgabe wert nur ein String und kein String[]. 🙁

22.11.2008 - 13:58 Uhr

Hallo,

hab seit längeren ein Problem mit dem einlesen einer Textdatei. Er soll nichts weiter tun als über den StreamReader zeilenweise die Datei zu lesen und den inhalt in einem Array ablegen. Dabei ist es wichtig das die datei Sequenziell, also von anfang bis ende Zeile für Zeile gelesen wird.
Aus mir unersichtlichen gründen scheint der Reader in der Datei zu anderen Zeilen zu springen. (z.B. von Zeile 432 in Zeile 1254 bis 1299 und zurück zu Zeile 433). Wie kann ich das verhindern?

Man sieht das ich bisl rumprobiert habe und sorry für das bisl Durcheinander.


FileStream d = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read);
message("  Zähle Lines ...");
            d.Position = 0;
            //data = new StreamReader(textBox1.Text);
            data = new StreamReader(d);
            do { data.ReadLine(); Lines++; } while(!data.EndOfStream);
            Console.WriteLine("Lines:" + Lines.ToString());
            data.Close();

            message("  Einlesen der Daten ...");
            Helper conv = new Helper();
            Data = new Sammler[Lines];
            data = new StreamReader(textBox1.Text);
            for(i=0; i<Lines; i++) 
            {
                tmp=data.ReadLine().Split(' ');
                Data[i] = new Sammler();
                Data[i].IP = tmp[0];
                Data[i].Time = conv.TimeConv(tmp[3].Trim('['));
                Data[i].AdrLong =tmp[6].Trim('"');
                Data[i].AdrShort = conv.AdrConv(tmp[6].Trim('"'));
                Data[i].Code = int.Parse(tmp[8]);
                Data[i].Byte = int.Parse(tmp[9]);
                if (tmp[5].Trim('"').ToLower() == "get") Data[i].GET = true; else Data[i].GET = false;
                progress(i, Lines-1);
                Console.WriteLine(Data[i].Time.ToShortDateString() + " - " + Data[i].Time.ToShortTimeString());
            }
            data.Close();
            data.Dispose();
            d.Close();
            d.Dispose();