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; //beinhaltet alle Dateinamen
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

user profile iconr0xta hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconbakachan 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.


C#-Quelltext
1:
-(.+?-.+?)-                    


Yogu - Fr 30.07.10 12:54

user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
@Yogu
Würde das nicht auch als regulärer Ausdruck gehen? Sieht vielleicht nicht elegant aus, aber erfüllt den Zweck.


C#-Quelltext
1:
-(.+?-.+?)-                    

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!