Hallo, ich bin mittlwerweile fast 50, befinde mich mitten im Selbststudim C# und bin in einem Projekt, um Playlisten (textatei) zu konvertieren.
Leider komme ich mit dem REG EX Code nicht klar und finde keine gescheite Hilfe in den Dokus. Im RegExLab.exe Testprogramm fungtioniert es, aber im C# Code dann nicht mehr.
Ausgangsdatei:
D:___NEUDATENBANK\060_60ER\0__SOFT 60ER\TOP10\DORIS DAY - WHATEVER WILL BE WILL BE (QUE SERA, SERA).MP3|TAG|DORIS DAY|WHATEVER WILL BE WILL BE (QUE|*****|THE BEST OF POP VOCAL||ALT||MP3|0|124682|0|327680|0|0|-1|0|0|0|3|192|10|-1|0|0|0|1585128386|0||0|-1|-1|
D:___NEUDATENBANK\206_2006 CHARTS\09. SCHLAGER\VANESSA - WINMAL IST KEINMAL (WIENER WALZER).MP3|TAG|VANESSA|WINMAL IST KEINMAL (WIENER WALZER)|||2005|160 PROMO|SCHLAGER DT.|MP3|94.0400009155273|188558|0|327680|0|0|-1|0|0|0|3|160|10|-1|0|0|0|479148238|2||0|-1|-1|
Mit der REGEX Filterung sollen nur die fett dargestellen Bestandteile ausgeworfen werden.
Mein RegEx code: ([^|]*)
public static void read2()
{
const string f = @"C:\tmp\test.txt";
List<string> lines = new List<string>();
using (StreamReader r = new StreamReader(f))
{
string line;
while ((line = r.ReadLine()) != null)
{
//edit the line
string pattern = @"([^\|]*)";
Console.WriteLine(Regex.Replace(line, pattern, String.Empty));
//edit the line
Console.ReadKey();//Kontrollpunkt
lines.Add(line);
}
}
foreach (string s in lines)
{
Console.WriteLine(s);//Kontrollpunkt
using (StreamWriter sw = File.AppendText(@"c:\tmp\playlist.m3u"))
sw.WriteLine(s);
Console.ReadKey();//Kontrollpunkt
}
Console.ReadKey();//Kontrollpunkt
}
Könnte mir jemand bei der RegEx Filterung helfen?
Hallo alexpj und willkommen im Forum,
ich finde dass Regex hier fehl am Platz ist. Ein einfaches Substring wäre hier besser:
Console.WriteLine(line.Substring(0, line.IndexOf('|')));
Dein Pattern war schon richtig nur hast du die Falsche Methode verwendet:
line = Regex.Match(line, pattern).ToString();
Hier gibt es auch noch einen guten online Regex Tester: https://regex101.com
Gruß
Steffen
das hat gut funktioniert. Vielen Dank!
Ich denke, ich traue mich, die eine oder andere Frage in diesem Forum zu stellen, wenn ich wieder einmal festhänge.
Alex
Hi alexpj,
Ich denke, ich traue mich, die eine oder andere Frage in diesem Forum zu stellen, wenn ich wieder einmal festhänge.
Das klingt ja fast wie eine Mutprobe 😃
Aber genau dazu ist das Forum doch da! Solange die 10 Punkte in unserem [Hinweis] Wie poste ich richtig? weitestgehend beachtet werden, kann jeder hier seine Frage(n) loswerden.
Christian
Weeks of programming can save you hours of planning
Na dann.... 😃
Ich habe noch ein Spezialfall zu lösen. Ergänzend zu dem File oben möchte ich auch welche mit mit zahlreichen Überschriften zusätzlich strukturiert zu splitten und mit dem Namen der jeweiligen Überschrift zu speichern.
**:::
**:::
Mein Plan:
Ich würde gern eine Schleife programmieren und:
durch das Vezweigen in immer neue Files bin ich etwa ratlos, wie man das angehen soll.
Hallo alexpj,
bitte beachte den Punkt 4 unter [Hinweis] Wie poste ich richtig?
Wo hängst Du den?
Eine Schleife hast Du doch schon (wo ReadLine aufgerufen wird). In dieser Schleife einfach vorher die Überschrift matchen, wenn zutreffend dann einen Dateinamen erstellen und gleich den streamwriter öffnen und bei der nächsten iteration die filenamen direkt reinschreiben.
public static void read_grp()
{
const string f = @"C:\tmp\test2.grp";
string line;
string newfilename = "test";
List<string> lines = new List<string>();
using (StreamReader r = new StreamReader(f))
{
while ((line = r.ReadLine()) != null)
{
//===================Gruppennamen filtern==========================
try
{
if (line.Substring(0, 1) == "[")
{
newfilename = line;
//Ausgabekontrolle neuer Filename
Console.WriteLine("Dateiname: " + newfilename);
continue;
}
//===================Splitt bei Leerzeile==========================
else if (!string.IsNullOrWhiteSpace(line))
{
//Abneiden Reststring nach '|'
line = (line.Substring(0, line.IndexOf('|')));
//Abschneiden von 'Trackxxxx=' am Zeilenanfang // +1 damit auch das '=' gelöscht wird
lines.Add(line.Substring(line.IndexOf('=')+1));
//Console.WriteLine("Dateiname: " + newfilename + Environment.NewLine + "Trackname: " + line); //Ausgabekontrolle
}
else
{
//hier müßte die Erkennung der Leerzeile liegen
//Ab hier neuer Dateinemane
continue;
}
}
catch (Exception ex) { }
}
}
foreach (string s in lines)
{
using (StreamWriter sw = File.AppendText(@"c:\tmp\"+newfilename+".m3u"))
sw.WriteLine(s);
}
}
Also ich hab das Quoting im Vorpost mal farbig gemacht. Ich lese aus dem File die (im Moment nur erste) Überschrift aus und generiere daraus den neuen Filenamen. Dann werden die Einträge ausgelesen, hinten abgeschnitten (Danke für die Hilfe) und vorn gekürzt.
btw:
Vieles lernt man durch ausprobieren... so läßt sich Substring(line.IndexOf('=')+1) durch die +1 auf das eigentliche Zeichen (=) erweitern.....hab ich so nirgendwo gelesen.
Leider habe ich keinen Plan, wie der Splitt vor der 2. Überschrift und Speicherung in die neue Datei da integriert werden müssen.
Bitte lacht euch nicht schlapp über meinen Code. Ich beschäftige mich erst seit 5 Tagen mit C# und hab vorher noch nie (außer Basic in den 80er) programmiert....
Weiter geht es in Review: Regex-Filter in Textdatei anwenden