Autor Beitrag
r0xta
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Fr 30.07.10 11:38 
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?

ausblenden 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!


Zuletzt bearbeitet von r0xta am Fr 30.07.10 11:41, insgesamt 1-mal bearbeitet
Chiller_No.1
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 62
Erhaltene Danke: 6

Win 7, Win XP, Win Vista
C++, C#, HTML
BeitragVerfasst: 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

_________________
L_ This is Schäuble. Copy Schäuble into your signature to help him on his
OL own way to Überwachungsstaat.
r0xta Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 62
Erhaltene Danke: 6

Win 7, Win XP, Win Vista
C++, C#, HTML
BeitragVerfasst: 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 :@

_________________
L_ This is Schäuble. Copy Schäuble into your signature to help him on his
OL own way to Überwachungsstaat.
bakachan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
string bla = strArray[0]+strArray[2]...					


Mit RegEx ist das ganze auch möglich aber könnte hier etwas overkill sein

Für diesen Beitrag haben gedankt: r0xta
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 30.07.10 11:53 
Hallo,

am besten verwendest du reguläre Ausdrücke. In .NET gibt es dafür die Klasse RegEx. 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:

ausblenden 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.

Für diesen Beitrag haben gedankt: r0xta
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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.

ausblenden C#-Quelltext
1:
-(.+?-.+?)-					
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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.

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

Hm, das passt aber ein paar mal in den Ausgangsdateinamen. Schöner wäre vielleicht folgendes:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 503
Erhaltene Danke: 34

W7 (x64) Ultimate
C# / VB.NET (VS2010 Ultimate)
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
string[] sub = dateiname.Split(separator);					
r0xta Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Fr 30.07.10 14:02 
Sinnigerweise...
Danke euch!