Aus einem Dateinamen (mp3) Strings herausfiltern

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Aus einem Dateinamen (mp3) Strings herausfiltern

Beitrag 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
PureBasic 6.00 | Windows 10 pro (x64)
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Aus einem Dateinamen (mp3) Strings herausfiltern

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Aus einem Dateinamen (mp3) Strings herausfiltern

Beitrag von ts-soft »

Normalerweise nimmt man einen TagReader dafür: http://www.purebasic.fr/english/viewtop ... 32#p420732
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Aus einem Dateinamen (mp3) Strings herausfiltern

Beitrag 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
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Aus einem Dateinamen (mp3) Strings herausfiltern

Beitrag 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
a²+b²=mc²
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Aus einem Dateinamen (mp3) Strings herausfiltern

Beitrag 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:
PureBasic 6.00 | Windows 10 pro (x64)
Omi
Beiträge: 143
Registriert: 25.03.2013 09:59

Re: Aus einem Dateinamen (mp3) Strings herausfiltern

Beitrag 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
PureBasic Linux-API-Library: http://www.chabba.de
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Aus einem Dateinamen (mp3) Strings herausfiltern

Beitrag 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!
Zuletzt geändert von Zerosurf am 19.11.2015 18:52, insgesamt 1-mal geändert.
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Aus einem Dateinamen (mp3) Strings herausfiltern

Beitrag 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
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Aus einem Dateinamen (mp3) Strings herausfiltern

Beitrag von Zerosurf »

Kein Problem. Das "[^-]+" war gar nicht nötig.
Was bewirkt das?
PureBasic 6.00 | Windows 10 pro (x64)
Antworten