Ganzzahlen ordnen

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

Re: Ganzzahlen ordnen

Beitrag von Zerosurf »

Ui, ja das ist schon etwas komplizierter! ;)
gäbe noch ein Problem, wenn am Ende des Templates was anderes als ein Buchstabe steht
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. ;)
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
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

Beitrag von PureLust »

Zerosurf hat geschrieben:Der Code soll bewirken, ...
Ah ok ... ich nehme an, dass Du dann also Dein Projekt von 2015 fortsetzen möchtest?

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

Re: Ganzzahlen ordnen

Beitrag von Zerosurf »

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)
Benutzeravatar
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

Beitrag von NicTheQuick »

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

Re: Ganzzahlen ordnen

Beitrag von Zerosurf »

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.
Vielen Dank, aber ich möchte keine mp3 taggen - sondern sie in eine Sqlite - Datenbank mit Hilfe eines Templates einfügen! ;)
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
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

Beitrag von NicTheQuick »

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

Re: Ganzzahlen ordnen

Beitrag von Zerosurf »

Habs endlich geschafft:

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$
Vielen Dank an alle die mir geholfen haben!
:)
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
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

Beitrag von PureLust »

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. :mrgreen:

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
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. :D
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)
Benutzeravatar
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

Beitrag von PureLust »

Zerosurf hat geschrieben:Habs endlich geschafft:
Sieht gut aus. :allright:

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

Re: Ganzzahlen ordnen

Beitrag von Zerosurf »

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. ;)
PureBasic 6.00 | Windows 10 pro (x64)
Antworten