Laden...

Regex, um CSV-Dateien zu splitten

Erstellt von Sombrero vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.303 Views
S
Sombrero Themenstarter:in
15 Beiträge seit 2010
vor 13 Jahren
Regex, um CSV-Dateien zu splitten

Guten Abend,

ich brauche Hilfe bei der Erstellung von zwei Regex.

Folgendermassen sollen sie aussehen:

  • Der erste soll alles finden bis zu einem Zeilenumbruch(\r bzw. \n)
  • Der zweite soll (aus dem ersten) die Werte finden welche durch ein Komma getrennt sind.

Hab es heute schon seit zwei Stunden ausprobiert, leider ohne erfolg. Jetzt, da ich mich gerade an meiner Abschlussarbeit befinde und bis jetzt noch nie mit Regex gearbeitet habe. Wollte ich jemand gnädig um Hilfe bitten, ob er diese für mich erstellen kann.

Ich bin bereits mit ReguLazy am ausprobieren, leider bin ich unfähig. 😕

Vielen Danke und Gruss
Sombrero

edit:
Den ersten hab ich jetzt: ^.*
Ist das Korrekt oder hab ich was vergessen(laut ReguLazy sollte es korrekt sein)

2.223 Beiträge seit 2005
vor 13 Jahren

Hallo Sombrero,

wie wäre es einfach mit diesem hier

(.*?),

Viele Grüße
Lars

S
Sombrero Themenstarter:in
15 Beiträge seit 2010
vor 13 Jahren

Hallo Lars,

Gibt den "String", aus. Leider nicht das erwünschte Ergebnis. Ich habe ein bisschen weiter ausprobiert.

Dieser sollte beide meiner Wünsche erfüllen:
^[a-zA-Z0-9._]|\r

Ist es peinlich, wenn ich selber nicht weiss was es genau macht? 😄

Anyway, klappt mit Testdaten wunderbar. Hoffe morgen bei der Arbeit tut es ebenfalls. Wenn jemand so nett wäre das bei sich auszuprobieren und mir bescheid zu geben ob es wirklich funktioniert bzw. ob ich etwas vergessen habe oder weiteres beachten muss.

Danke & Gruss Sombrero

2.223 Beiträge seit 2005
vor 13 Jahren

Hmm irgendwie ist mir das nicht ganz klar,

  • Der zweite soll (aus dem ersten) die Werte finden welche durch ein Komma getrennt sind.

und genau das würde meiner machen, mein Regulärer Ausdruck splittet den String genau beim ','

Dein Regulärer Ausdruck scheint zwar zu funktionieren, aber ich denke auch nur wirklich zufällig und erbringt nur die Ergebnisse bis zum ersten ',' alles danach ist weg.

Viele Grüße
Lars

F
26 Beiträge seit 2009
vor 13 Jahren

Schau doch z.B. mal auf dieser Seite, die finde ich persönlich sehr gut:

http://www.gskinner.com/RegExr/

Davon gibt auch noch ein paar andere. Damit kannst du deine Regex bequem erstellen und on-the-fly das Ergebnis sehen!

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Sombrero,

Wollte ich jemand gnädig um Hilfe bitten, ob er diese für mich erstellen kann.

wir sind dafür da, um zu helfen, aber wir sind keine Pattern-Erstell-Maschine.

herbivore

S
Sombrero Themenstarter:in
15 Beiträge seit 2010
vor 13 Jahren
Regex um String zu splitten

Hallo zusammen,

da wir hier, wie herbivore gesagt hat, nicht in einem Pattern-Erstell-Maschine-Forum sind. Zeige ich mal ein bisschen Eigeninitiative und bitte zusätzlich noch um Hilfe.

Ich hab folgenden String:
10.11.8.1,core-shu-vl100,,,bla.doman.kom,Router,"stringinstring",,,,,-1,0,,,-1,,,,3
10.11.8.2,chaas01z,,,shu.shi.shang,Others," PXC00.E.D / 3.OG Dach",00a003024633,,,,-1,0,,,-1,,,,3

aus diesem möchte ich jetzt mit einem Regex Ausdruck alle einzelnen Strings auslesen.
Ich hab dafür folgenden Regex: ^[a-zA-Z0-9._-/ ]|\r

Er liest auch alles aus. Leider gibt es noch einen kleinen Schönheitsfehler, welcher mir in den Matches leere Values findet. Weiss jemand Rat, warum?

Mit folgendem Code hab ich es getestet(aus LazyReg):

        private void button1_Click(object sender, EventArgs e)
        {
            string regex = @"^*[a-zA-Z0-9._\-\/ ]*|\r";
	RegexOptions options = RegexOptions.Multiline;
    string input = @"10.11.8.1,core-shu-vl100,,,bla.doman.kom,Router,"stringinstring",,,,,-1,0,,,-1,,,,3
10.11.8.2,chaas01z,,,shu.shi.shang,Others," PXC00.E.D / 3.OG Dach",00a003024633,,,,-1,0,,,-1,,,,3";
	
	MatchCollection matches = Regex.Matches(input,regex,options);
  foreach (Match match in matches)
	{
		Console.WriteLine("Value: " + match.Value);
	}

        }
    }

Danke & Gruss Sombrero

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Sombrero,

vorneweg: wenn du an einem Komma trennen willst, dann sollte in deinem Pattern auch ein Komma enthalten sein. So, wie du es versuchst, bist du ja darauf angewiesen, dass die Werte einen bestimmten Aufbau haben. Warum sollte aber der Aufbau der Werte eine Rolle spielen, wenn die Forderung ist, bei Komma zu splitten? Ich würde also in die Richtung gehen, die Lars Schmitt eingeschlagen hat.

Er liest auch alles aus. Leider gibt es noch einen kleinen Schönheitsfehler, welcher mir in den Matches leere Values findet.

Die direkte Ursache ist, dass du * statt + benutzt. Allerdings finde ich es keinen Fehler, leere Matches zu finden, denn es ist nunmal im Allgemeinen ein Unterschied, ob die Eingabe "5,,7,2" oder "5,7,,2" ist.

Davon abgesehen ist der * nach ^ Quatsch. 😃

Ich bin bereits mit ReguLazy am ausprobieren,

Vielleicht gefällt die On-the-fly Regex-Tester: Regex-Lab besser.

herbivore

S
Sombrero Themenstarter:in
15 Beiträge seit 2010
vor 13 Jahren

Hallo,

hab mich jetzt an den Tipp von Lars Schmitt und herbivore gehalten.
Mein Regex sieht momentan folgendermassen aus: (?<value>.*?)[,\n\r]

Was mir jetzt noch fehlt, ist es den Value herauslesen welcher am Ende der Zeichenfolge ist.

Also: bla1,bla2,bla3
Das: bla3

Wie ist den der Ausdruck für ein Zeilenende?

Gruss Sombrero

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Sombrero,

Wie ist den der Ausdruck für ein Zeilenende?

$

Allerdings nicht zu verwenden innerhalb von []. Du musst also eine Alternative (|) verwenden.

herbivore