Entwickler-Ecke
C# - Die Sprache - String trimmen an bestimmten Stellen
r0xta - Fr 30.07.10 11:38
Titel: String trimmen an bestimmten Stellen
Hallo zusammen,
ich versuche derzeit mehrere Dateinamen, die ich als string in ein Array eingelesen habe, zu ändern.
Die Dateinamen haben alle folgendes Ausgangsformat:
AAAA-0000.00.00-BB_BBB_BB-1111-CC.dd
AA-0000.00.00-BBBB_BB-1111-CC.dd
AAA-0000.00.00-BB_BBBBB-1111-CC.dd
Das Endformat soll dann so aussehen:
0000.00.00 BB BBB BB
0000.00.00 BBBB BB
Die strings sollen also nach dem ersten und vor dem zweiten, sowie nach dem zweiten und vor dem dritten Trenn-/Bindestrich beschnitten werden.
Das mit dem Trennen ist ja über Split() zu lösen - aber wie kann ich ihm nun sagen dass er eben nicht alles nehmen soll?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| FileInfo[] files; foreach (FileInfo fiOutput in files) { string dateiname = fiOutput.ToString(); char[] separator = new char[] { '-' }; foreach (string sub in dateiname.Split(separator)) { FileStream fs = new FileStream(directoryPath + @"\index.txt", FileMode.Append); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(sub); sw.Close(); fs.Close(); } } |
Danke schon mal!
Chiller_No.1 - Fr 30.07.10 11:41
Villt etwas unschön.. Aber ersetzte Alle A´s durch "" (also nichts halt) alle - zu " " alle _ zu " " usw... GAnz genau was du vorhast geht mir da sowieso noch nicht hervor aber villt kanst du es ja damti schonmal lösen^^
mfg chiller
r0xta - Fr 30.07.10 11:45
Hm vllt durchaus bisserl blöd erklärt ;)
Aber di AAAs sind als Platzhalter gedacht.
Hier mal ein konkreteres Beispiel:
Ausgangsformat:
FLA-2010.12.31-Blindtext_Lorem_Ipsum-123456-BlaBla.pdf
Endformat:
20010.12.31 Blindtext Lorem Ipsum
Chiller_No.1 - Fr 30.07.10 11:48
:D das sieht schon anders aus ;) das macht meine Lösung ein bisschen sinnlos^^ Ich mein wir hätten hier im Forum mal eine Thread dazu gehabt ich such macl eben :@
bakachan - Fr 30.07.10 11:50
r0xta hat folgendes geschrieben : |
Die strings sollen also nach dem ersten und vor dem zweiten, sowie nach dem zweiten und vor dem dritten Trenn-/Bindestrich beschnitten werden.
Das mit dem Trennen ist ja über Split() zu lösen - aber wie kann ich ihm nun sagen dass er eben nicht alles nehmen soll? |
Bei der Split-Funktion kommt ein String-Array zurück, also müsstest du doch einen neuen String aus den Teilen zusammensetzen können.
C#-Quelltext
1:
| string bla = strArray[0]+strArray[2]... |
Mit RegEx ist das ganze auch möglich aber könnte hier etwas overkill sein
Yogu - Fr 30.07.10 11:53
Hallo,
am besten verwendest du reguläre Ausdrücke. In .NET gibt es dafür die Klasse
RegEx [
http://msdn.microsoft.com/de-de/library/system.text.regularexpressions.regex.aspx]. Hast du damit schon mal gearbeitet? Wenn nicht, auf der verlinkten Seite gibt es ein gutes Beispiel dazu.
Dazu brauchst du ein Suchmuster, das
Pattern. Es könnte bei dir in etwa so aussehen:
Quelltext
1:
| (.{2,4})-0000\.00\.00-(.{2}_.{3}_.{2})-1111-(.{2})\..{2} |
Ein Punkt steht für ein beliebiges Zeichen, die Klammern gruppieren einen bestimmten Ausdruck, auf den nachher zugegriffen werden kann. Die geschweiften Klammern geben an, wie oft ein Zeichen (hier immer der Punkt als Platzhalter) vorkommen soll.
Edit: Hups, ich habe deine Muster wohl etwas zu wörtlich ausgelegt. Ein regulärer Ausdruck ist wohl tatsächlich etwas zu kompliziert hier, du musst ja nur an den Bindestrichen trennen. Die Unterstriche kannst du über
Replace('_', ' ') ganz einfach zu Leerzeichen ersetzen. Und wie du nur an die relevanten Teile kommst, hat
bakachan ja schon beschrieben.
Trashkid2000 - Fr 30.07.10 12:03
Hi,
ich finde auch, dass dazu ein regulärer Ausdruck angebracht wäre! Overkill? Finde ich nicht.
Aus dem Match- Objekt nimmst Du Dir dann die Gruppe, und ersetzt dann "-" und "_" mit Leerstellen.
@Yogu
Würde das nicht auch als regulärer Ausdruck gehen? Sieht vielleicht nicht elegant aus, aber erfüllt den Zweck.
Yogu - Fr 30.07.10 12:54
Trashkid2000 hat folgendes geschrieben : |
@Yogu
Würde das nicht auch als regulärer Ausdruck gehen? Sieht vielleicht nicht elegant aus, aber erfüllt den Zweck.
|
Hm, das passt aber ein paar mal in den Ausgangsdateinamen. Schöner wäre vielleicht folgendes:
Quelltext
1:
| ^.*-(?<time>.*)-(?<name>.*)-.*$ |
Du hast Recht, das geht doch recht gut mit regulären Ausdrücken. Aber genauso gut funktioniert es mit einem
Split('-');.
r0xta - Fr 30.07.10 13:48
Vielen Dank schon mal für die Antworten.
Von regulären Audrücken habe ich bisher noch nichts gehört, würde mich da auch mit auseinander setzen falls Split nicht funktioniert, weil:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| foreach (string sub in dateiname.Split(separator)) { FileStream fs = new FileStream(directoryPath + @"\index.txt", FileMode.Append); StreamWriter sw = new StreamWriter(fs); sw.WriteLine(sub); sw.Close(); fs.Close(); } |
Ich steh vermutlich vollends aufm Schlauch, aber ich seh grad nicht wie bei dateiname.split ein Array zurückkommt.
nehm ich z. B. string dateiname = ABC-12.12.2010-Bla_bla-123-xx.pdf
dann bekomm ich doch mit der foreach für sub folgende Ausgabe in der Textdatei zurück:
Quelltext
1: 2: 3: 4: 5:
| ABC 12.12.2010 Bla_bla 123 xx.pdf |
wenn ich jetzt sw.WriteLine(sub[1] + sub[3]); nehme...
ööhm wo is mein Denkfehler?
bakachan - Fr 30.07.10 13:56
in deiner foreach-schleife läufst du doch alle Einträge des Arrays einzeln durch
die schleife muss weg
C#-Quelltext
1:
| string[] sub = dateiname.Split(separator); |
r0xta - Fr 30.07.10 14:02
Sinnigerweise...
Danke euch!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!