*.txt durchsuchen
-
kann ich vielleicht durch einen Zähler herausbekommen wie viele zeilen meine *.txt hat? oder gibt es eine art "EndOfFile" um eine while schleife so lang ausführen zu lassen bis EOF erreicht ist??
Fragen über fragen.....
-
zeig doch mal bischen Code (siehe obigen Post)
ich glaub reader.read gibt ein int mit der Größe zurück oder ansonten while reader!=null
-
int i = 0; while(reader.ReadLine()!=null) { zeile[i] = reader.ReadLine(); writer.WriteLine(zeile[i]); i++; }
Das war jetzt mein versuch ob ich das alles verstanden habe soweit und ob die Daten übernommen werden. Hier stellt sich ein Problem auf!! es werden nur ca. die Hälfte der Zeilen übernommen. jetzt werden ich mich daran versuchen die zeilen zu filtern, mal sehen wie weit ich dort komme!! Für weitere Hilfen / Infos wäre ich dankbar!!
Gruß
-
Es werden nicht nur ca. die hälfte der Zeilen übernommen, sondern ziemlich genau jede zweite:
int i = 0; while(reader.ReadLine()!=null) // hier liest Du die nächste Zeile und schaust ob das Ende der Datei erreicht ist { zeile[i] = reader.ReadLine(); // hier liest Du die nächste Zeile und verwertest sie writer.WriteLine(zeile[i]); i++; }
Fällt dir was auf? Du liest zwei Zeilen pro Durchgang aber verwertest jeweils nur die zweite.
-
int i = 0; while(zeile[i] = reader.ReadLine()!=null) { writer.WriteLine(zeile[i]); i++; }
Habs nicht probiert aber ich glaub so sollte es tun!
-
Da die Operatorenrangfolge in C# wie in C ist besser:
while ( ( zeile[i] = reader.ReadLine() ) != null )
-
oh man, das grenzt ja schon an dämlichkeit!! hab das echt net gecheckt vorhin!! naja jetzt klappt das soweit, aber das war ja auch erst der einfache teil!! jetzt das "filtern" wird bestimmt nicht so einfach!!
-
Hallo, ich bins schon wieder, ich hab mir noch ein wenig gedanken gemacht und mir die *.txt nochmal angesehen. Wie ich festgestellt habe gibt es 2 von diesen "Füllwörtern" die besonders häufig vorkommen. das ist einmal "Bestand" und einmal "Wechsel" mit Regex.Replace habe ich diese schon mal entfernt, so dass diese mir keine sorgen mehr bereiten können. macht es viel sinn weiter nach diesem Verfahren zu arbeiten oder ist das eher eine "dirt'n'easy" methode??
while ((zeile[i] = reader.ReadLine()) != null) { string result = Regex.Replace(zeile[i], "Bestand", ""); string result2 = Regex.Replace(result, "Wechsel", ""); writer.WriteLine(result2); // Einträge vornehmen i++; }
Gruß
-
Ohne deine Textdatei zu kennen halte ich das für ne "dreckige" Variante ;). Da du gesagt hast "ziemlich häufig" bleiben dann wohl die eine oder andere Zeile übrig, die du per Hand editieren musst.
Ich hätte deinen ersten Ansatz genommen und nach den Produkten gesucht:
while(..) { Regex r = new Regex("Produkt\\s*(\\d+)"); Match m = r.Match(zeile); //deine Zeile int anz = 0; string[] ergebnis = new string[2]; while(m.Success && anz<=1) { ergebnis[anz] = m.Groups[0].Captures[0].ToString(); m = m.NextMatch(); anz++; } string ende; if(anz>1) ende = ergebnis[0]; else ende = ergebnis[0] + ergebnis[1]; }
habs jetzt net getestet, is also eher pseudocode ;). und an die ergebnisse der regex-suche kommt man sicherlich auch einfacher ran.
btw.: in der zweiten Group des Regex-Ergebnisses ist die Nummer des Produkts gespeichert.//edit: Das Pattern um die Möglichkeit von Leerzeichen zwischen der Zahl und "Produkt" erweitert.
-
cin schrieb:
Ohne deine Textdatei zu kennen halte ich das für ne "dreckige" Variante ;). Da du gesagt hast "ziemlich häufig" bleiben dann wohl die eine oder andere Zeile übrig, die du per Hand editieren musst.
Ist schon richtig, mir ist auch dummerweise aufgefallen das nur die Wörter entfernt werden die am Anfang der Zeile stehen, sollten diese irgendwo mitten drin stehen bleiben diese!!
-
Da bin ich schon wieder
Habe nun nochmal eine frage. Kann ich mit der Klasse "String" meine Zeilen überprüfen ob sie z.B. "Bestand" enthält?? oder noch besser wäre eine "BeginntMit" überprüfung!! das würde mir die sache arg vereinfachen!!
Gruß
-
string zeile; //... if(zeile.IndexOf("Bestand") == 0) // Zeile fängt mit "Bestand" an
-
Gut gut, danke erstmal für die viele hilfe die mir angeboten wird. Allerdings bin ich immernoch nicht bei dem ergenis das ich gerne hätte!!
Ich habe hier bewusst sehr auffällige Produktnamen gewählt um mein Problem zu verdeutlichen.
ich habe mitlerweile in meiner Textdatei stehen:
"Banane - " "nach Apfel + Birne"
"Banane Luxus - " "nach Apfel Standard mit Birne 500"
"Apfel + Birne 1000 - " "nach Apfel + Birne Standard
*Hoffe das ist halbwegs anschaulich!! Wie gesagt als ergebnis möchte ich später
"Banane";"Apfel";"Birne"
"Banane Luxus";"Apfel Standard";"Birne 500"
"Apfel";"Birne 1000";"Apfel";"Birne Standard"
*Zu den ersten beiden Zeilen, bzw. zu der ersten. ich kann ja nicht jede Zeile auf "Banane" durchsuchen, denn sonst würde ich bei der zweiten auch ein ergebnis bekommen obwohl es sich hier ja um "Banane Standard" handelt. Ich kann ich nicht mit
zeile = zeile.Substring(4, zeile.Length - 4).Trim();
arbeiten, da die Produktnamen unterschiedlich lang sind!! Die 4 ist hier frei gewählt, dient nur zur veranschaulichung!! Kann mir irgendjemand nochmal helfen, ich wäre sehr sehr dankbar dafür!! Dann geh ich euch auch bald nicht mehr auf die nerven hier!!
gruß
//edit: Mir würde es schon helfen wenn ich erstmal die '+' Zeichen weg bekommen würde. Habe mein Glück mal wieder mit RegEx.Replace() veruscht aber das klappt nicht, kann man damit keine Sonderzeichen ersetzen, oder braucht es da besondere zeichenfolgen??
//edit:
result.Replace(" + ", " \";\" ");
funktioniert nicht!! kann es Probleme geben wenn nicht in jeder zeile ein ' + ' steht?? muss ich vorher prüfen ob ein + in der zeile enthalten ist oder nicht??
-
Bin ja selbst noch C#-Anfänger und hab was (übertrieben kompliziertes
) zusammengebastelt:
using System.IO; using System.Text.RegularExpressions; class Test { public static void Main() { FileStream fin = new FileStream("datei1.txt", FileMode.OpenOrCreate); StreamReader sin = new StreamReader(fin); FileStream fout = new FileStream("datei2.txt", FileMode.Create); StreamWriter sout = new StreamWriter(fout); Regex pattern = new Regex(@"[A-Za-z][A-Za-z 0-9]+[A-Za-z0-9]"); string oldLine = sin.ReadLine(); string newLine = ""; while(oldLine != null) { MatchCollection matches = Regex.Matches(oldLine, @"[A-Za-z][A-Za-z 0-9]+[A-Za-z0-9]"); foreach(Match match in matches) { string smatch = "\"" + match.Value + "\""; smatch = smatch.Replace(" mit ", "\";\""); smatch = smatch.Replace("nach ", ""); newLine += smatch + ";"; } newLine = newLine.Remove(newLine.Length - 1, 1); sout.WriteLine(newLine); oldLine = sin.ReadLine(); newLine = ""; } sin.Close(); sout.Close(); } }
Ich hab keinen Zweifel, dass es viel einfacher geht.
[Edit] Und tatsächlich, übers Duschen kommen einem die besten Einfälle
using System.IO; using System.Text.RegularExpressions; class Test { public static void Main() { FileStream fin = new FileStream("datei1.txt", FileMode.OpenOrCreate); StreamReader sin = new StreamReader(fin); FileStream fout = new FileStream("datei2.txt", FileMode.Create); StreamWriter sout = new StreamWriter(fout); Regex pattern = new Regex(@"[^A-Za-z0-9]{2,}|[^A-Za-z0-9 ]"); string line = sin.ReadLine(); while(line != null) { line = pattern.Replace(line, "\";\""); line = line.Replace(" mit ", "\";\""); line = line.Replace("nach ", ""); line = line.Trim('\"'); line = line.Trim(';'); sout.WriteLine(line); line = sin.ReadLine(); } sin.Close(); sout.Close(); } }
-
Hallo und vielen dank. die Lösung klappt soweit ganz gut, einziges Problem ist das die letzte Zeile folgendermaßen aussieht:
"Banane Premium";"na
weiterhin habe ich festgestellt das 6 Zeilen unterschlagen werden!! Kennt jemand den grund wenn man den Code sieht? Ich nicht
//edit:
noch eine kleine Frage
Regex pattern = new Regex(@"[^A-Za-z0-9]{2,}|[^A-Za-z0-9 ]");
habe ich geändert in
Regex pattern = new Regex(@"[^A-Za-z0-9]{2,}|[^A-Za-z0-9 ][b][-][/b]");
um auch Bindestrich zulassen zu können. Nun wollte ich selbe mit ( ) veruschen, aber ohne erfolg.... *verzweifel*
-
freggel schrieb:
Hallo und vielen dank. die Lösung klappt soweit ganz gut, einziges Problem ist das die letzte Zeile folgendermaßen aussieht:
"Banane Premium";"na
Kanns sein, dass in der Eingangsdatei am Ende kein " steht?
weiterhin habe ich festgestellt das 6 Zeilen unterschlagen werden!!
Wie sehen die Zeilen aus?
-
Michael E. schrieb:
Kanns sein, dass in der Eingangsdatei am Ende kein " steht?
In der Quelldatei steht hinter jeder Zeile ";
auch in dieser zeile die etwas abgehackt wurde!!Michael E. schrieb:
Wie sehen die Zeilen aus?
Die Zeilen sehen in etwa so aus:
"Banane Profi";" nach Banane Business";
-
freggel schrieb:
Regex pattern = new Regex(@"[^A-Za-z0-9]{2,}|[^A-Za-z0-9 ]");
habe ich geändert in
Regex pattern = new Regex(@"[^A-Za-z0-9]{2,}|[^A-Za-z0-9 ][b][-][/b]");
um auch Bindestrich zulassen zu können.
Regex pattern = new Regex(@"[^A-Za-z0-9-]{2,}|[^A-Za-z0-9 -]");
Allerdings kriegst du dann Probleme mit
"Banane Luxus - " "nach Apfel Standard mit Birne 500"
Sollen Bindestriche nur in Verbindung mit Buchstaben erlaubt sein?
Nun wollte ich selbe mit ( ) veruschen, aber ohne erfolg.... *verzweifel*
Raff ich nicht
-
Michael E. schrieb:
Raff ich nicht
hat sich soweit erledigt, war nur zu dumm zum lesen... bzw. hab mir das nochmal genauer angesehen und gecheckt warum das net klappt!! nun hab ich nur noch das Problem mit der abgehackten Zeile und den 6 fehlenden....
-
[quote="freggel...hat sich soweit erledigt, war nur zu dumm zum lesen... bzw. hab mir das nochmal genauer angesehen und gecheckt warum das net klappt!! ...[/quote]
oder vielleicht deswegen