Abgeteilt von Regex-Filter in Textdatei anwenden
und in Reviews verschoben
ich habe mir eine Lösung selbst erarbeiten können. Mich würde mal interessieren, ob das ein halbwegs vernünftiger Aufbau ist bzw. was könnte man anders/besser lösen?
Auf die RegEx Geschichte hab ich ganz verzichtet. Das konnte ich komplett mit substring() lösen!
Die korrekte Pfadangabe zur Namensgebung der Files löse ich später in den Windows Forms, da ich den Input aus einer ListBox bekomme.
public static void read_grp()
{
const string f = @"C:\tmp\test2.grp";
string line;
string newfilename = "test";
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);
//lese nächste Zeile
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
line = (line.Substring(line.IndexOf('=') + 1));
//Schreibe Zeile in neue Playlist
using (StreamWriter sw = File.AppendText(@"c:\tmp\" + newfilename + ".m3u"))
sw.WriteLine(line);
//Console.WriteLine("Dateiname: " + newfilename + Environment.NewLine + "Trackname: " + line); //Ausgabekontrolle
}
else
{
//Leerzeile erkannt -> ab hier neuer Dateinamen
newfilename = line;
continue;
}
}
catch (Exception ex) { }
}
}
}
Hallo, hier mein Vorschlag (nicht getestet!)
public static void read_grp()
{
const string Filename = @"C:\tmp\test2.grp";
string line;
string newFilename = "test";
using (StreamReader r = new StreamReader(Filename))
{
while (!r.EndOfStream)
{
try
{
line = r.ReadLine();
if (string.IsNullOrWhiteSpace(line))
{
// Leerzeile überspringen, nächste Zeile einlesen
continue;
}
if (line.StartsWith("[") && line.EndsWith("]"))
{
// Gruppennamen als Dateiname verwenden (ohne eckige Klammer)
newFilename = line.Substring(1, line.Length - 2);
// Ausgabekontrolle neuer Filename
Console.WriteLine("Dateiname: " + newFilename);
}
else
{
// Abschneiden Reststring nach '|'
line = line.Substring(0, line.IndexOf('|'));
// Abschneiden von 'Trackxxxx=' am Zeilenanfang // +1 damit auch das '=' gelöscht wird
line = line.Substring(line.IndexOf('=') + 1);
// Schreibe Zeile in neue Playlist
using (StreamWriter sw = File.AppendText(@"c:\tmp\" + newFilename + ".m3u"))
{
sw.WriteLine(line);
}
// Console.WriteLine("Dateiname: " + newfilename + Environment.NewLine + "Trackname: " + line); //Ausgabekontrolle
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
interessant....vielen Dank dafür! Schaut irgendwie besser aus 😉
Ich hab das gleich in ein Windows Forms Projekt eingebaut. Funktioniert ebenso einwandfrei.
Um die Dateipfade aus den Listboxeintragen zu bekommen hab ich folgendes geändert:
string path = (listBox1.SelectedItem.ToString().Substring(0, listBox1.SelectedItem.ToString().LastIndexOf(@"\") + 1));
....
using (StreamReader r = (new StreamReader(listBox1.SelectedItem.ToString())))
so landen die konvertierten Ergebnisse im gleichen Pfad wie die Quelldateien
Abschlussfrage:
catch (Exception ex)
{
Console.WriteLine(ex);
}
Muss die Exception ausgegeben werden?
Muss die Exception ausgegeben werden?
Du kannst mit der Exception machen, was du magst 😉 Nur schlucken solltest du sie nicht. Also: loggen, ausgeben, sonstwie behandeln. Nur ein leerer Catch-Block wäre die schlechteste Alternative 😉
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck