string per trennzeichen splitten,aber nicht bei jedem trennzeichen?

striker159

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
327
hallo,
ich habe mir eine kleine funktion geschrieben, die bei allen (mp3) dateien in einem ordner aus dem dateinamen den interpret und den titel ausließt, und diese in den id3 tag schreibt.
die dateinamen haben die form interpret, leerzeichen, trennzeichen, leerzeichen, titel ; also
interpret - titel zb.
übergeben wird der orderpfad und das trennzeichen.

so sieht mein code aus (delphi)
Code:
procedure SetId3Tags(Path,split: string);
var titel1,titel2,inter2:string;
    stream: TFilestream;
    SR: TSearchRec;
    Id3v2Tag: TId3v2Tag;
begin
  Id3v2Tag := TId3v2Tag.Create;
  if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then
  begin
    repeat
      if (SR.Attr <> faDirectory) then
      begin
        stream := TFileStream.Create(Path+SR.Name, fmOpenRead or fmShareDenyWrite);
        Id3v2Tag.ReadFromStream(stream);
        stream.free;
        titel1 := stringreplace(sr.Name,'.mp3','',[rfIgnoreCase]);
        inter2 := copy(titel1,0,pos(' '+split+' ',titel1));
        titel2 := copy(titel1,pos(' '+split+' ',titel1)+1,length(titel1));
        //titel2 := stringreplace(titel2,' (Full) [HD]' ,'',[rfIgnoreCase]);
        titel2 := stringreplace(titel2,split+' ','',[rfIgnoreCase]);
        id3v2tag.Title := copy(titel2,1,length(titel2));
        id3v2tag.Artist :=inter2;
        id3v2Tag.WriteToFile(Path+SR.Name);
      end;
    until FindNext(SR) <> 0;
    FindClose(SR);
  end;
  Id3v2Tag.Free;
end;


procedure TForm1.Button1Click(Sender: TObject);
var pfad,trennzeichen:string;
begin
  pfad := EPfad.Text;
  if pfad[length(pfad)]<>'\' then
    pfad := pfad+'\';
  trennzeichen := stringreplace(Etrennzeichen.Text,' ','',[rfReplaceAll]);
  SetId3Tags(pfad,trennzeichen);
  showmessage('fertig');
end;

schön und gut, das funktioniert soweit.

jetzt habe ich aber zwei fragen.

1.wenn im dateinamen der interpret auch "leerzeichen-trennzeichen-leerzeichen" hätte, wären die tags verhunzt. gibt es eine möglichkeit, dass dann trotzdem an der richtigen stelle geteilt wird? man kann ja nicht festlegen ' du teilst erst beim 2 vorkommen des trennzeichens'. schließlich kann ja auch alles "normal" sein und nur ein trennzeichen vorhanden sein.

2. wie bekomme ich es hin, dass es egal ist, ob voranstehende/nachstehende leerzeichen neben dem trennzeichen sind? also dass der dateiname auch so aussehen kann:
interpret -titel
interpret- titel
interpret-titel
auch wieder unter berücksichtigung von 1. ( ein '-' im interpret kommt wohl häufiger vor als ein ' - ' ^^)
 
Stichwort: Reguläre Ausdrücke.

Ich kann jetzt selbst kein Delphi, aber in den meisten Sprachen sind diese von der Syntax sehr ähnlich.

Eine Regulärer Ausdruck, der dein Ziel verfolgt könnte so aussehen:
Interpret: .*(?=\s?\-\s?[^\-]*$)
Titel: (?<=\s?\-\s?)[^\-]*$

Diese Ausdrücke basieren auf der Tatsache, dass der Titel ein "-" enthält - er teil also immer am hintersten "-" auf. Wenn das doch der Fall ist, ist das Problem nicht eindeutig Lösbar. Dann müsstest du dir die Fälle, in denen mehr als ein Minus vorkommt ausgeben lassen, selbst anschauen und per Hand trennen.
 
Reguläre Ausdrücke sind eine gute Sache und ich würde sie zur Lösung verwenden, wenn sie zur Verfügung stehen. Anderenfalls würde ich ein Split für den Trenn-String (Leerzeichen optional Trennzeichen Leerzeichen optional) als Funktion programmieren.

Bzgl. (1) hätte der Split dann mehr als 2 Teile und die Interpretation liegt dann bei dir. Z.B.
split("Interpret1-Interpret2 - Titel") = ["Interpret1", "Interpret2", "Titel"]
Hier könntest du z.B. immer den letzten Teil als Titel nehmen und den Interpret als Conact der vorderen Teile mit den Trenn-String ('-')

Alternativ suche von hinten in der Zeichenkette nach dem ersten Vorkommen eines Trenn-String. Der Teil vor den Trenn-String ist dann der Interpret, der Teil dahinter der Titel.
 

Ähnliche Themen

Zurück
Oben