Seite 1 von 2
Aus einem Dateinamen (mp3) Strings herausfiltern
Verfasst: 19.11.2015 18:04
von Zerosurf
Hallo,
ich möchte gerne aus einem Dateinnamen (mp3) der so aufgebaut ist: "Code-Track - Artist - Title.mp3" die jeweiligen Strings herausfiltern.
Das hab ich ich soweit auch hinbekommen, nur kann ich den Code auch vereinfachen?
Hier der Code:
Code: Alles auswählen
string.s ="SM0033-07 - Robbie Williams - Let Me Entertain You.mp3"
L = Len(string)
x.s = "-"
y.s = "."
a = FindString(string, x)
Code.s = Left(string, a-1)
Debug Code
firstsplit.s = Right(string, L-a)
L = Len(firstsplit)
a = FindString(firstsplit, x)
Track.s = Left(firstsplit, a-2)
Debug Track
secondsplit.s = Right(firstsplit, L-a-1)
L = Len(secondsplit)
a = FindString(secondsplit, x)
Artist.s = Left(secondsplit, a-2)
Debug Artist
thirdsplit.s = Right(secondsplit, L-a-1)
L = Len(thirdsplit)
a = FindString(thirdsplit, y)
Title.s = Left(thirdsplit, a-1)
Debug Title
Re: Aus einem Dateinamen (mp3) Strings herausfiltern
Verfasst: 19.11.2015 18:12
von Nino
Code: Alles auswählen
FileName$ = "SM0033-07 - Robbie Williams - Let Me Entertain You.mp3"
s$ = GetFilePart(FileName$, #PB_FileSystem_NoExtension)
For i = 1 To 4
Debug Trim(StringField(s$, i, "-"))
Next
Re: Aus einem Dateinamen (mp3) Strings herausfiltern
Verfasst: 19.11.2015 18:12
von ts-soft
Re: Aus einem Dateinamen (mp3) Strings herausfiltern
Verfasst: 19.11.2015 18:23
von NicTheQuick
Wenn man es aber aus den Dateinamen extrahieren will, sind Regular Expressions sinnvoll:
Code: Alles auswählen
string.s ="SM0033-07 - Robbie Williams - Let Me Entertain You.mp3"
Define regex.i = CreateRegularExpression(#PB_Any, "([^-]+)\-([0-9]+) \- ([^-]+) \- ([^-]+)\.mp3")
If ExamineRegularExpression(regex, string)
While NextRegularExpressionMatch(regex)
If CountRegularExpressionGroups(regex) = 4
Debug "Code: " + RegularExpressionGroup(regex, 1)
Debug "Track: " + RegularExpressionGroup(regex, 2)
Debug "Interpret: " + RegularExpressionGroup(regex, 3)
Debug "Titel: " + RegularExpressionGroup(regex, 4)
EndIf
Wend
EndIf
Edit:
Geht übrigens auch mit entsprechender Anpassung auch für mehrere Titel pro String:
Code: Alles auswählen
Define string.s
string = ~"SM0033-07 - Robbie Williams - Let Me Entertain You.mp3\n" +
~"SM0034-08 - Dizzy Gillespie - A Night in Tunisia.mp3"
Define regex.i = CreateRegularExpression(#PB_Any, "^([^-]+)\-([0-9]+) \- ([^-]+) \- ([^-]+)\.mp3$", #PB_RegularExpression_MultiLine | #PB_RegularExpression_AnyNewLine)
Define i.i = 1
If ExamineRegularExpression(regex, string)
While NextRegularExpressionMatch(regex)
Debug "Nummer " + i
If CountRegularExpressionGroups(regex) = 4
Debug ~"\tCode: " + RegularExpressionGroup(regex, 1)
Debug ~"\tTrack: " + RegularExpressionGroup(regex, 2)
Debug ~"\tInterpret: " + RegularExpressionGroup(regex, 3)
Debug ~"\tTitel: " + RegularExpressionGroup(regex, 4)
EndIf
i + 1
Wend
EndIf
Code: Alles auswählen
Nummer 1
Code: SM0033
Track: 07
Interpret: Robbie Williams
Titel: Let Me Entertain You
Nummer 2
Code: SM0034
Track: 08
Interpret: Dizzy Gillespie
Titel: A Night in Tunisia
Re: Aus einem Dateinamen (mp3) Strings herausfiltern
Verfasst: 19.11.2015 18:40
von Kiffi
problematisch wird es, wenn in Interpret und/oder Titel das Trennzeichen vorhanden ist. Beispiel: A-HA.
Deswegen +1 für Thomas' Vorschlag.
Grüße ... Peter
Re: Aus einem Dateinamen (mp3) Strings herausfiltern
Verfasst: 19.11.2015 18:42
von Zerosurf
WAHNSINN!!! Ich bin immer wieder erstaunt, wie wenig Code man doch eigentlich braucht, wenn man programmieren kann! Diese Tipps sind goldwert!!!
Vielen Dank!!!

Re: Aus einem Dateinamen (mp3) Strings herausfiltern
Verfasst: 19.11.2015 18:47
von Omi
Hallo Zerosurf,
oder ganz kurz und dafür unsicher
Code: Alles auswählen
FileName$ = "SM0033-07 - Robbie Williams - Let Me Entertain You.mp3"
s$ = GetFilePart(FileName$, #PB_FileSystem_NoExtension)
For i = 1 To CountString(s$, " - ") + 1
Debug StringField(s$, I, " - ")
Next
Gruß Charly
Re: Aus einem Dateinamen (mp3) Strings herausfiltern
Verfasst: 19.11.2015 18:50
von Zerosurf
Ich glaube auch, daß die Lösung von NicTheQuick die beste ist!
So, jetzt muss ich das ganze noch mit diesem Code verbinden, damit das Programm diese Daten dann in eine sql-datenbank schreibt!
Code: Alles auswählen
Procedure.l SearchDirectory(dir$, List yourLinkedList.s(), pattern$="", recursive=1)
Static level.l=-1
If Not Right(dir$, 1) = "\"
dir$+"\"
EndIf
Protected dir.l=ExamineDirectory(#PB_Any, dir$, pattern$)
If dir
While NextDirectoryEntry(dir)
If DirectoryEntryName(dir) <> "." And DirectoryEntryName(dir) <> ".."
AddElement(yourLinkedList())
For n=CountString(dir$, "\")-level To CountString(dir$, "\")
yourLinkedList()+StringField(dir$, n, "\")+"\"
Next
yourLinkedList()+DirectoryEntryName(dir)
If DirectoryEntryType(dir) = #PB_DirectoryEntry_Directory
yourLinkedList()+"\"
EndIf
EndIf
Wend
FinishDirectory(dir)
EndIf
Protected all.l=ExamineDirectory(#PB_Any, dir$, "")
If all
While NextDirectoryEntry(all)
If DirectoryEntryType(all) = #PB_DirectoryEntry_Directory And DirectoryEntryName(all) <> "." And DirectoryEntryName(all) <> ".."
level+1
SearchDirectory(dir$+DirectoryEntryName(all)+"\", yourLinkedList(), pattern$, recursive)
level-1
EndIf
Wend
FinishDirectory(all)
EndIf
ProcedureReturn ListSize(yourLinkedList())
EndProcedure
UseSQLiteDatabase()
DatabaseFile$ = "D:\\sqlite\KaraokeSongs.sqlite"
; If CreateFile(0, DatabaseFile$)
; CloseFile(0)
; Else
; Debug "Can't create the database file !"
; End
; EndIf
If OpenDatabase(0, DatabaseFile$, "", "")
; DatabaseUpdate(0, "CREATE TABLE Songlist (IdNr INTEGER PRIMARY KEY, Pfad TEXT, Dateiname TEXT, Artist TEXT, Title TEXT, DiscID TEXT, TrackNo INTEGER)")
; Else
; Debug "Can't open database !"
; End
EndIf
path$="F:\Karaoke Songs\ALL SONGS SORTED\#mp3-wav + cdg\Code-Nr - Artist - Title\A 12\"
NewList FilesAndFolders.s()
found = SearchDirectory(path$, FilesAndFolders(), "*.mp3", 1)
ForEach FilesAndFolders()
Pfad$=path$+FilesAndFolders()
Pfad$ = ReplaceString(Pfad$, "'", "''")
FilesAndFolders() = ReplaceString(FilesAndFolders(), "'", "''")
DatabaseUpdate(0, "INSERT INTO Songlist (Pfad, Dateiname, Artist, Title, DiscID, TrackNo) VALUES ('" + Pfad$ + "', '" + FilesAndFolders() + "', '', '', '', '')")
Next
CloseDatabase(0)
Debug found
Vielleicht hat da jemand auch eine einfacherere Lösung!
Re: Aus einem Dateinamen (mp3) Strings herausfiltern
Verfasst: 19.11.2015 18:52
von NicTheQuick
Kiffi hat geschrieben:problematisch wird es, wenn in Interpret und/oder Titel das Trennzeichen vorhanden ist. Beispiel: A-HA.
Kein Problem. Das "[^-]+" war gar nicht nötig.
Code: Alles auswählen
Define string.s
string = ~"SM0033-07 - Robbie Williams - Let Me Entertain You.mp3\n" +
~"SM0034-08 - Dizzy Gillespie - A Night in Tunisia.mp3\n" +
~"SM0035-09 - A-HA - Take on me.mp3"
Define regex.i = CreateRegularExpression(#PB_Any, "^([^-]+)\-([0-9]+) \- (.+) \- (.+)\.mp3$", #PB_RegularExpression_MultiLine | #PB_RegularExpression_AnyNewLine)
Define i.i = 1
If ExamineRegularExpression(regex, string)
While NextRegularExpressionMatch(regex)
Debug "Nummer " + i
If CountRegularExpressionGroups(regex) = 4
Debug ~"\tCode: " + RegularExpressionGroup(regex, 1)
Debug ~"\tTrack: " + RegularExpressionGroup(regex, 2)
Debug ~"\tInterpret: " + RegularExpressionGroup(regex, 3)
Debug ~"\tTitel: " + RegularExpressionGroup(regex, 4)
EndIf
i + 1
Wend
EndIf
Re: Aus einem Dateinamen (mp3) Strings herausfiltern
Verfasst: 19.11.2015 19:12
von Zerosurf
Kein Problem. Das "[^-]+" war gar nicht nötig.
Was bewirkt das?