Suchen und Ersetzen in txt ?

Deletemaster

Erfahrenes Mitglied
Hallo zusammen,
ich möchte eine textdatei zb. txt1 auslesen, nacheinander verschiedene Zeichen löschen, bzw. ersetzen.
das Ergebnis möchte ich mir in txt2 ausgeben lassen.
Istzustand: 0 G:\Archiv\Archiv 09\Peter Maffay\Peter Maffay Steppenwolf\12 - Peter Maffay - Wahrheit.mp3 Wahrheit Peter Maffay Steppenwolf Andere 190066
Sollzustand: G:;Archiv;Archiv09;Peter Maffay;Peter Maffay Steppenwolf;12;Peter Maffay;Wahrheit

Könnt ihr mir bitte helfen, dieses in C# umzusetzen?
(Die Textdatei enthält viele Zeilen, in jeder Zeile steht immer EIN Datensatz !)
Danke
 
Tach !

Also, warum benutzt du nicht die Funktionen des String Typs ?
Da gibt es doch String.replace String.remove String.Substring damit läßt sich doch einiges machen. Geht das denn nicht ?

MFG JJB

_
 
ja das versuche ich, aber irgendwie ist die Ausgabe nicht korrekt
ich habe erst mal DEN string in 3 Substrings aufgeteilt, und diese in eine neue txt geschrieben
ALLERDINGS wird diese doppelt ausgegeben ? WARUM?
Quelle:
G:\Archiv09\Verzeichnis_1\Verzeichnis_2\
Code:
StreamReader fstr_in = new StreamReader(fin);
	while((s = fstr_in.ReadLine()) != null)				{
	int pos1 = s.IndexOf("\\",0);						string sLw = s.Substring(0,pos1);		
	int str2 = s.IndexOf("\\", pos1+1);
	string sVerz = s.Substring(pos1+1, s.IndexOf("\\", str2));
	sVerz = s.Replace("\\",";");

	int str3 = s.IndexOf("\\", str2+1);
	string sVerz_1 = s.Substring(str2+1, s.IndexOf("\\", str3));
	sVerz_1 = s.Replace("\\",";");

	try
	{
	fout.Write(sLw + sVerz + sVerz_1);
	}
	catch(IOException ex)
	{
	MessageBox.Show(ex.Message);
	}			
				
}
fout.Close();
Ausgabe:
G:G:;Archiv09;Verzeichnis_1;Verzeichnis_2;G:;Archiv09;Verzeichnis_1;Verzeichnis_2;
Wo mache ich denn da den Fehler?
 
Also der Code erscheint mir doch ein wenig kompliziert....

Ich nehme mal an du hast eine Datei mit Pfaden und willst für jede Zeile die einzelnen Pfadelemente extrahieren.

Dann nehme ich zuerst den String. Ob mit Streamreader oder FileOpen oder sonst was ist ja egal.
Ich unterteile den String mit

String[] aArray = myString.split( 'das Trenn-Character');

Und dann mache ich eine Schleife und lese meine Elemente einzeln aus. Du kannst mit Element 0 oder 1 anfangen je nachdem was du suchst.

Und was deinen Fehler angeht... Du gibst

sLw + sVerz + sVerz_1

aus. Wobei ich nicht weis was sLW sein soll. Jedoch sVerz und sVerz_1 sind das selbe.
Du machst beides mal, ist gleich s.Replace("\\",";");
Du vergißt, dass es sich beim s immer noch um den original eingelesenen String handelt. Er wurde nicht verändert.

Dein Denkfehler war hier

string sVerz = s.Substring(str2+1, s.IndexOf("\\", str3));
sVerz = s.Replace("\\",";");

Zuerst füllst du deine gewünschten Daten in sVerz und dann holst du dir schon wieder s.
du hättest sVerz = sVerz.Replace("\\",";"); machen sollen.

Doch ich würde den Code wirklich mit dem Split machen, dein Beispiel ist zu speziell und unflexibel. Er funktioniert nur für die ersten 3 Ebenen. Und wenn es mal mehr werden mußt du deinen Code erweitern.

Hoffe das hat geholfen.

MFG JJB

_
 
ja danke, werde es gleich ausprobieren.
sLW ist die VAriable für stringLaufWerk usw....
allerdings wird diese txt grösser habe mir erst mal nur eine test txt vorgenommen.
die datei die ich bearbeiten möchte umfasst mitlerweise mehr als 8000 Zeilen
und in der sind verschiedene Formatierungen vorzunehmen.
Aber ich denke, wenn ich das Prinzip begriffen habe, bekomme ich den Rest auch hin.
Deine Vermutung mit den Pfaden ist Richtig! Ich möchte diese Pfade in einzelne Datenbankfelder schreiben und später ggf. wieder zusammensetzen und verlinken Möglich ist das doch oder?
 
Jetzt ist die Ausgabe noch seltsamer...?
Mein Code:
Code:
StreamReader fstr_in = new StreamReader(fin);
while((s = fstr_in.ReadLine()) != null)	//liest eine Zeile des Datensatzes aus
{
int pos1 = s.IndexOf("\\",0);		//suche eine \, beginne bei 0
string sLw = s.Substring(0,pos1);
//der ertse string ist alles bis zum 1.\

int str2 = s.IndexOf("\\", pos1+1);
string sVerz = s.Substring(pos1+1, s.IndexOf("\\", str2));
sVerz = sVerz.Replace("\\",";");

int str3 = s.IndexOf("\\", str2+1);
string sVerz_1 = s.Substring(str2+1, s.IndexOf("\\", str3));
sVerz_1 = sVerz_1.Replace("\\",";");

try
{
fout.Write(sLw + sVerz + sVerz_1);
}
Die Ausgabe:
G:Archiv09;VeVerzeichnis_1;Verzeichnis
und das Semikolon hinter G: fehlt ?
Hmmm Wieder Denkfehler?
 
Du willst
Code:
G:\Archiv09\Verzeichnis_1\Verzeichnis_2\

zu
Code:
G:;Archiv09;Verzeichnis_1;Verzeichnis_2;

machen ?

Dann nimm String aNewString = aOldString.replace("\\";"\;")

Aber wenn du wirklich die einzelnen Elemente haben willst, dann versuche es mit
Code:
String[] aStringArray = aOldString.split('\');

foreach(Sting aString in aStringArray)
{
   SendStringToDBField(aString);
}

oder etwas wie
Code:
for(int i=0; i < aStringArray.GetLegth(0) ; i++)
{
   DBField[i] = aStringArray[i];
}

Oder eine ArrayList oder eine HashTable was auch immer....

Zu deinen Fehlern:
Du hast das Problem, dass du mit Indizes jonglierst. Das ist ein Risiko, da sie von Fall zu Fall unterschiedlich behandelt werden. Manchmal sind Indizes 0 basiert manchmal auf 1. Manchmal bekommt man den aktuellen Index, manchmal den zuletzt gelesenen, manchmal den nächst zu lesenden. Das kommt auf die Befehle an. Ich würde dir von Indexzählerei abraten.

Du machst hier den Fehler dass du denkst, du machst.

aString = s.Substring(BeginAt, EndAt);

Tatsächlich aber heißt die Funktion

aString = s.Substring(BeginAt, AmountOfLetters);

Und du hast nun den Index des Endwertes als Anzahl eingegeben. Dann kommt natürlich was ganz anderes dabei raus. Du müsstest erst noch den Wert der bereits verarbeiteten Zeichen vom Index abziehen, um die länge des kommenden Strings zu ermitteln und diesen dann als Länge eingeben.

Und jetzt sind wir dort wo ich bereits sagt "unflexibel". Mach das lieber mit dem Split, sonst verirrst du dich zwischen Indizes.
Genausowenig würde ich dir raten, Labels und Gotos zu benutzen.

Kommst du damit weiter ?
 
eigentlich will ich noch viel mehr...
siehe erstes posting (Suchen und Ersetzen in txt ?)
Leider nutze ich eine fremde Software um diese Daten in eine txt zu bekommen (musicmatch)
toll wäre es, wenn ich mit FolderBrowserDialog mir ein Verzeichnis auswählen könnte, und ALLE Unterverzeichnisse mit ALLEN Dateien SELBER in eine txt schreiben könnte
Aber ich glaube das ist ein bisschen zu kompliziert ODER?
 

Neue Beiträge

Zurück