*.txt durchsuchen
-
Hallo zusammen,
ich bin ein absoluter C#-Neuling und habe keinen Plan wie ich vorgehen soll. Ich hoffe mal auf eure Hilfe!!Zu meinem Problem:
Ich habe eine Textdatei in der ca. 800 Zeilen stehen. Die zeilen sehen in etwas so aus:
Wechsel von Produkt1 zu Produkt2
Neubeauftragung Produkt3
Wechsel von Produkt9 nach Produkt2Leider ist diese Datei nicht geordnet, sonder irgendwann mal per Hand erstellt worden und jeder hat die Zeilen so verfassen wie es ihm grade in den Sinn kam. Ich möchte das nu mit einem C# Programm ändern. Ich möchte eine neue *.txt erstellen die dann folgendermaßen aussehen soll.
"Produkt1";"Produkt2";
" ";"Produkt3"
"Produkt9";Produkt2"Die Befehle zum öfnnen und Speichern der Textdateien habe ich, mir fehlt leider nur das dazwischen
Ich weiß, es ist eine verdammt dumme frage, aber vielleicht kann mir doch jemand helfen!! Ich hoffe auf euch!!
Gruß
-
darf man fragen wie du die Datei öffnest? denn dann kann man da ja ansetzen
Wenn du es als Sting einliest wäre vielleicht http://msdn2.microsoft.com/de-de/library/system.string.compare(VS.80).aspx das interessant
-
ich habe mir folgende befehle dafür rausgesucht
StreamWriter writer = File.CreateText(Application.StartupPath + "\\*.txt"); // Datei erzeugen writer.WriteLine("TEXT"); // Einträge vornehmen writer.Close(); // Den Dateizugriff beenden string[] zeile; // Ein Array für die Methode String.Split erstellen string name, nummer; // Bin nicht sicher ob es sinn hat, denn in den //Produktnamen können auch " " vorkommen StreamReader reader = File.OpenText(Application.StartupPath + "\\*.txt"); // Datei öffnen reader.Close();
Auf besonderen Wunsch editiert
-
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