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
Normalerweise nimmt man einen TagReader dafür: http://www.purebasic.fr/english/viewtop ... 32#p420732

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


:allright: :allright: :allright:

Re: Aus einem Dateinamen (mp3) Strings herausfiltern

Verfasst: 19.11.2015 18:47
von Omi
Hallo Zerosurf,

oder ganz kurz und dafür unsicher :wink:

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?