Das gleiche Problem habe ich auch mit meinem Code gehabt. Aber ich werd mir mal den Code von PureLust einverleiben und daran etwas basteln. Wobei ich immer dankbar für weitere (weniger komplizierte) Vorschläge bin.gäbe noch ein Problem, wenn am Ende des Templates was anderes als ein Buchstabe steht
Ganzzahlen ordnen
Re: Ganzzahlen ordnen
Ui, ja das ist schon etwas komplizierter!
PureBasic 6.00 | Windows 10 pro (x64)
- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Re: Ganzzahlen ordnen
Ah ok ... ich nehme an, dass Du dann also Dein Projekt von 2015 fortsetzen möchtest?Zerosurf hat geschrieben:Der Code soll bewirken, ...
Wie Du vielleicht weißt, sind normalerweise genau diese Informationen, die Du aus den Dateinamen auslesen möchtest (also Artist, Title, Disc, TrackNr.,...), auch in der MP3 Datei selber nochmals gespeichert - in sogenannten <ID3-Tags>.
Hierzu hatte Dir ts-soft damals schon mal einen Beitrag mit der idealen Lösung verlinkt.
Und zwar hatte er hier eine Routine vorgestellt, die Dir aus einer MP3-Datei genau diese Informationen heraus sucht.
Du warst damals nicht darauf eingegangen ... vielleicht weil Dir das etwas zu kompliziert erschien?
Es wäre meiner Meinung aber definitiv die beste und 'sicherste' Lösung, da Du Dich nicht mit verschiedenen Varianten von Dateinamen herum schlagen musst und unter Umständen auch Dateinamen dabei sind, die nicht korrekt aufgelöst werden können.
Versuch doch mal, ob Du den Code von ts-soft so einigermaßen verstehen kannst und wenn Du dann Fragen hast, können wir Dir da bestimmt noch weiter helfen.
Grüße, PL.
Zuletzt geändert von PureLust am 20.01.2020 18:37, insgesamt 1-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Re: Ganzzahlen ordnen
Leider gibt es da keine mp3 Tags und genau deswegen versuche ich es erneut - aber ich komm schon weiter - bin grad noch am tüfteln!
PureBasic 6.00 | Windows 10 pro (x64)
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Ganzzahlen ordnen
Ohne dir jetzt den Spaß am Programmieren nehmen zu wollen, aber genau für diese Sache nutze ich EasyTAG. Das gibt es für Linux und Windows und ich habe damit meine gesamte MP3-Sammlung gesäubert. Es kann Daten aus Dateinamen und MP3-Tags lesen und schreiben und austauschen. Es unterstützt außerdem noch viele andere Musikformate und hat noch einige weitere Extrafeatures.
Re: Ganzzahlen ordnen
Vielen Dank, aber ich möchte keine mp3 taggen - sondern sie in eine Sqlite - Datenbank mit Hilfe eines Templates einfügen!NicTheQuick hat geschrieben:Ohne dir jetzt den Spaß am Programmieren nehmen zu wollen, aber genau für diese Sache nutze ich EasyTAG. Das gibt es für Linux und Windows und ich habe damit meine gesamte MP3-Sammlung gesäubert. Es kann Daten aus Dateinamen und MP3-Tags lesen und schreiben und austauschen. Es unterstützt außerdem noch viele andere Musikformate und hat noch einige weitere Extrafeatures.
PureBasic 6.00 | Windows 10 pro (x64)
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Ganzzahlen ordnen
Richtig. Und wenn die Dateien einmal ordentlich getaggt sind, dann ist das ein Kinderspiel. Ohne MP3-Tags zeigt dir ein Player ja auch immer nur sowas wie "Unbekannter Künstler - Track 01" oder ähnliches an. Mit MP3-Tags hättest du beide Probleme gelöst. Aber gut, ich weiß auch zu wenig über dein Backend.
Probleme machen beim Windows-Dateisystem ja dann auch noch einige Sonderzeichen, die nicht gespeichert werden können. Zum Beispiel kann man keine Fragezeichen nutzen, auch keine Doppelpunkte oder Schrägstriche. In den Tags kann man diese Informationen aber problemlos speichern. Unter Linux ist es nicht ganz so wild, da ist nur / nicht erlaubt, alles andere geht. Und im Notfall kann man einfach den Division Slash nutzen.
Probleme machen beim Windows-Dateisystem ja dann auch noch einige Sonderzeichen, die nicht gespeichert werden können. Zum Beispiel kann man keine Fragezeichen nutzen, auch keine Doppelpunkte oder Schrägstriche. In den Tags kann man diese Informationen aber problemlos speichern. Unter Linux ist es nicht ganz so wild, da ist nur / nicht erlaubt, alles andere geht. Und im Notfall kann man einfach den Division Slash nutzen.
Re: Ganzzahlen ordnen
Habs endlich geschafft:
Vielen Dank an alle die mir geholfen haben!
Code: Alles auswählen
Template$ = "D-N - A - T"
Filename$ = "SF390-01 - Freya Ridings - Lost Without You"
Structure MyWerte
Name.s
Wert.l
EndStructure
PositionA = FindString(Template$, "A")
PositionT = FindString(Template$, "D")
PositionD = FindString(Template$, "N")
PositionN = FindString(Template$, "T")
NewList MyList.MyWerte()
AddElement(MyList())
MyList()\Name = "A"
MyList()\Wert = PositionA
AddElement(MyList())
MyList()\Name = "D"
MyList()\Wert = PositionT
AddElement(MyList())
MyList()\Name = "N"
MyList()\Wert = PositionD
AddElement(MyList())
MyList()\Name = "T"
MyList()\Wert = PositionN
SortStructuredList(MyList(), #PB_Sort_Ascending, OffsetOf(MyWerte\Wert), #PB_Long)
ForEach MyList()
MyList()\Wert = ListIndex(MyList())
Next
SortStructuredList(MyList(), #PB_Sort_Ascending, OffsetOf(MyWerte\Name), #PB_String)
SelectElement(MyList(), 0)
Artist$ = Trim(StringField(Filename$, MyList()\Wert + 1, "-"))
SelectElement(MyList(), 1)
DiscID$ = Trim(StringField(Filename$, MyList()\Wert + 1, "-"))
SelectElement(MyList(), 2)
TrackNr$ = Trim(StringField(Filename$, MyList()\Wert + 1, "-"))
SelectElement(MyList(), 3)
Title$ = Trim(StringField(Filename$, MyList()\Wert + 1, "-"))
Debug "Artist: " + Artist$
Debug "Title: " + Title$
Debug "DiscID: " + DiscID$
Debug "TrackNr: " + TrackNr$
PureBasic 6.00 | Windows 10 pro (x64)
- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Re: Ganzzahlen ordnen
Wie Nic schon sagte, ... MP3-Tags haben diverse Vorteile ... deswegen hat man sie ja erfunden.
Aber da Du ja sagtest dass Du die nicht nutzen willst und ich da irgendwie Bock drauf hatte, hab ich mal meinen Senf dazu in die Tastatur geprügelt.
Ich hab das allerdings so gemacht, dass bei der Maske (Template$), der 'Separator' in eckige Klammern gefasst werden muss (also z.B. [ - ]).
Falls Du's noch gebrauchen kannst ... viel Spaß beim reinschauen.
Aber da Du ja sagtest dass Du die nicht nutzen willst und ich da irgendwie Bock drauf hatte, hab ich mal meinen Senf dazu in die Tastatur geprügelt.
Code: Alles auswählen
EnableExplicit
Enumeration
#Separator
#_Artist
#_Title
#_Disk
#_Track
EndEnumeration
Structure Parse
Type.l
Separator.s
EndStructure
Structure MP3Info ; Structure mit MP3-Infos
Filename.s
Artist.s
Title.s
DiskID.s
TrackNr.s
EndStructure
Procedure GetSongInfo(FileName$, Mask$, *Song.MP3Info)
Static NewList Parse.Parse() ; ---- Liste, um die Infos aus dem Dateinamen heraus zu filtern ----
Static LastMask$
Protected n, m, c$, max
Protected MaskEND.s = "{*eNd*}" ; Um das Ende zu definieren, wird eine End-Token generiert
Protected AktFilename$ = GetFilePart(Filename$, #PB_FileSystem_NoExtension) + MaskEND ; Das End-Token wird an den zu parsenden Dateinamen angefügt
Mask$ + "[" + MaskEND + "]" ; Das End-Token wird an die zu verarbeitende Maske angefügt
max = Len(Mask$) ; Länge der Maske zwischenspeichern
ClearStructure(*Song, MP3Info) ; die übergebene Struktur muss geleert werden, sonnst könnten Reste von zuvor übrig bleiben
; ------------ parse Mask$, but only if Mask$ is not already parsed ----------------------
If Mask$ <> LastMask$
LastMask$ = Mask$
ClearList(Parse()) ; neue Maske - also Liste der zu parsenden Elemente Löschen
With Parse() ; 'With' benutzen, um Schreibweise für strukturierte Variablen zu verkürzen. Statt Parse()\Separator und Parse()\Type kann nun also \Separator und \Type geschrieben werden
For n = 1 To max ; die Maske vom ersten bis zum letzten Zeichen durchgehen
c$ = Mid(Mask$,n,1) ; aktuelles Zeichen der Maske verarbeiten
If c$ = "[" ; Wenn aktuelles Zeichen = '[', dann 'Separator' erkannt
For m = n+1 To max ; End-Zeichen für Separator suchen
If Mid(Mask$,m,1) = "]" ; End-Zeichen gefunden
Break ; Erkennung des Separators abschließen
Else
\Separator + Mid(Mask$,m,1) ; aktuelles Zeichen dem Separator hinzufügen - der komplette Separator befindet sich also nachher Parse()\Separator
EndIf
Next
n = m ; Zeiger für das nächstes Zeichen auf die Position nach dem erkannten Separator setzen
Else ; Kein Separator - also prüfen welches Datenfeld hier ausgewertet werden soll
AddElement(Parse()) ; neuen Element zur Parser-Liste hinzufügen
Select UCase(c$)
Case "A" : \Type = #_Artist ; Typ des Datenfeldes auswerten und in Parse()\Type speichern
Case "D" : \Type = #_Disk
Case "N" : \Type = #_Track
Case "T" : \Type = #_Title
EndSelect
EndIf
Next ; Fertig, nachdem alle Zeichen der Maske ausgewertet sind
; ForEach parse() : Debug "Type: " + \Type + " - " + \Separator : Next
EndWith
EndIf
; ------------------- parse FileName$ ------------------------
With *Song ; 'With' benutzen, um Schreibweise für strukturierte Variablen zu vereinfachen - *Song ist die übergebene Variable: SongInfo die als @SongInfo übergeben wurde
\Filename = Filename$ ; Name der datei in die Struktur der Rückgabevariable schreiben
n = 1 ; setzt die Suchposition auf das erste Zeichen
ForEach Parse() ; Alle zuvor gefundenen Separatoren der Maske abarbeiten - Einen nach dem Anderen
m = FindString(AktFilename$, Parse()\Separator, n) ; Position des aktuellen Separators heraus finden
If m > 0 ; Wenn Separator gefunden ...
c$ = Mid(AktFilename$, n, m-n) ; Text von aktueller Suchposition bis zum Separator ausschneiden
Select Parse()\Type
Case #_Artist : \Artist = c$ ; prüfen für welchen DatenTyp dieser Separator war und ausgeschnittenen Text dann in dieses Feld schreiben
Case #_Disk : \DiskID = c$
Case #_Track : \TrackNr = c$
Case #_Title : \Title = c$
EndSelect
n = m + Len(Parse()\Separator) ; neue Suchposition auf Zeichen HINTER dem gefunden Separator setzen
EndIf
Next ; wenn alle Separatoren abgearbeitet, dann feddisch ...
; Debug "Filename: " + \Filename + " - Artist: " + \Artist + " - Title: " + \Title + " - Disk/Track: " + \DiskID + "\" + \TrackNr
EndWith
EndProcedure
Define SongInfo.MP3Info ; ----- für MP3Infos strukturierte Variable - dienst für Rückgabewerte aus GetSongInfo()
Define Template$ = "D[-]N[ - ]A[ - ]T"
Define Filename$ = "SF390-01 - Freya Ridings - Lost Without You.mp3"
GetSongInfo(FileName$, Template$, @SongInfo) ; --- FileName und Maske übergeben - Ergebnis wird in die struktorierte Variable SongInfo geschrieben
Debug "Filename: " + SongInfo\Filename + " - Artist: " + SongInfo\Artist + " - Title: " + SongInfo\Title + " - Disk\Track: " + SongInfo\DiskID + "\" + SongInfo\TrackNr + #CRLF$
; ---
With SongInfo ; benutze 'With' für kürzere Schreibweise . . .
GetSongInfo("DS4120-12 - Harold Faltermeyer - Axel F..mp3", Template$, @SongInfo)
Debug "Filename: " + \Filename + " - Artist: " + \Artist + " - Title: " + \Title + " - Disk\Track: " + \DiskID + "\" + \TrackNr + #CRLF$
; ---
Template$ = "A[-]T[ - Disk:]D[ - Track:]N" ; ----- ein anderes Template / Maske definieren, für Dateinamen, die anders aufgebaut sind --------
GetSongInfo("yello - The Race - Disk:01 - Track:03.mp3", Template$, @SongInfo)
Debug "Filename: " + \Filename + " - Artist: " + \Artist + " - Title: " + \Title + " - Disk\Track: " + \DiskID + "\" + \TrackNr + #CRLF$
EndWith
End
Falls Du's noch gebrauchen kannst ... viel Spaß beim reinschauen.
Zuletzt geändert von PureLust am 20.01.2020 21:38, insgesamt 2-mal geändert.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Re: Ganzzahlen ordnen
Sieht gut aus.Zerosurf hat geschrieben:Habs endlich geschafft:
Kleiner Schönheitsfehler:
Du nutzt nicht wirklich die komplette Größe der Separatoren (also statt ' - ' nutzt Du nur '-') und der Separator muss immer ein Minuszeichen sein.
Wie Kiffi damals schon geschrieben hatte, treten dann bei Interpreten oder Songtexten mit '-' Probleme auf.
Bspl:
Code: Alles auswählen
Filename$ = "SF390-01 - a-ha - Take On Me" ; <= problematisch
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Re: Ganzzahlen ordnen
Hey Wahnsinn - vielen Dank - muss mal deinen Code studieren!
Bzgl Separator - ja, ich weiß, aber manche Karaoketitel haben manchmal Separatoren nur so " - " und manche auch ohne Space, also "-" - da muss ich dann einen Kompromiss machen oder eine Abfrage, wieviele "-" im String vorhanden sind und dem entsprechend eine Abfrage schreiben.
Bzgl Separator - ja, ich weiß, aber manche Karaoketitel haben manchmal Separatoren nur so " - " und manche auch ohne Space, also "-" - da muss ich dann einen Kompromiss machen oder eine Abfrage, wieviele "-" im String vorhanden sind und dem entsprechend eine Abfrage schreiben.
PureBasic 6.00 | Windows 10 pro (x64)