Laden...

Regex-Filter in Textdatei anwenden

Erstellt von alexpj vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.298 Views
A
alexpj Themenstarter:in
14 Beiträge seit 2015
vor 9 Jahren
Regex-Filter in Textdatei anwenden

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?

S
322 Beiträge seit 2007
vor 9 Jahren

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

A
alexpj Themenstarter:in
14 Beiträge seit 2015
vor 9 Jahren

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

5.658 Beiträge seit 2006
vor 9 Jahren

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

A
alexpj Themenstarter:in
14 Beiträge seit 2015
vor 9 Jahren

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:

  • die Überschrift jeweils in etwa so auslesen https://regex101.com/r/tF2bW4/1
  • als String zwischenspeichern,
  • den weitern Inhalt bis zur nächsten Überschrift auslesen und als String Zwischenspeichern.
  • Ein File nach der gespeicherten Überschrift benennen,
  • mit der ext. '.m3u' ergänzen
  • den Inhalt des zweiten Stings ins File schreiben.

durch das Vezweigen in immer neue Files bin ich etwa ratlos, wie man das angehen soll.

S
322 Beiträge seit 2007
vor 9 Jahren

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.

A
alexpj Themenstarter:in
14 Beiträge seit 2015
vor 9 Jahren
        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....

Hinweis von gfoidl vor 8 Jahren

Weiter geht es in Review: Regex-Filter in Textdatei anwenden