*.txt durchsuchen
-
Also gleich mehrere Sachen. Als erstes verwende bitte Codetags das macht es einfacher zu lesen!
So jetzt:
"\*.txt" geht so nicht wenn dann \\ sonst ist es eine Escapesequenceso dann kannste ja in deine zeile einlesen
zeile[0] = reader.ReadLine();
und schon ist die Zeile im Array!
jetzt kannste den einzelnen String nehmen und String.Compare machen.
-
Okay, danke!! ich werde das gleich mal testen und dann mal bescheid geben!!
Sry wegen meiner Unachtsamkeit mit dem Code!! soll nicht wieder vorkommen!! ich gelobe besserung!!
gruß
-
*gg* na dann sei dir verziehen!
P.S.: Mann kann Beiträge auch editieren!
-
Bei der zeile
zeile[i] = reader.ReadLine();
erhalte ich folgende Fehlermeldung!! Ich vermute es liegt an der größe meines Arrays, kann aber nicht feststellen wo, da mein Array groß genug sein sollte!!
Make sure that the maximum index on a list is less than the list size
Kann mir damit vtl jmd helfen??
-
spontan würde ich behaupten du solltest einen Schleifendurchlauf weniger machen zei mal bischen mehr code um die Schleife, und debug mal rein und schau mal die größen an!
-
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*