Danke für den Tip. Die mit dem Skript erzeugte Liste ist UTF8 und die "original" Liste ist ANSI. Beim Konvertieren zu ANSI passen die Werte wieder, aber keine Umlaute mehr bei den Sendernamen
TV Senderliste bearbeiten
-
dieselwiesel -
13. Dezember 2022 um 00:39 -
Unerledigt
-
-
auch hier sind es nur Sender mit Umlauten
Prüf mal in Notepad++ welches Format die Original-Datei hat (UTF8 etc.).
Ggf. braucht der TV ein bestimmtes Format und hat daher damit Probleme.
Ja, es ist ein Problem mit der Kodierung.
Versuche mal :
AutoIt
Alles anzeigen#include <File.au3> #include <Array.au3> Local $sNETSource, $aNETList, $sNETChannel, $sPattern Local $aSDXList, $aSDXListNew[0], $sSDXChannel Local $sFilePath, $hFileOpen $sNETSource = BinaryToString(InetRead("https://www.satindex.de/tv/1/1/0/"), 4) $sPattern = '<div class="col freqx_1" >.*?">(.*?)</a></div>' $aNETList = StringRegExp($sNETSource, $sPattern, 3) ; unter col freqx_1 sind die Sendernamen gelistet ; INFO : Aufbau der Fernsehliste.sdx ; ---------------------------------- ; Beispielzeile (Zeilenumbruch @LF) : ; SATCODX103Astra 1 (19.2E) TMPG20113030001ServusTV0192___ ______220002____________049140000101007_____________ HD Deutschl ; Die Sendernamen sind gesplittet, aber immer an festen Positionen. ; ==> max 8 Zeichen an Position 44..52 und (falls länger) max 12 Zeichen an Position 116..128 ; Der Sendername aus der .SDX-Datei ist max. 20 Zeichen lang, z.B. : ; ServusTV HD Deutschl ; Zu beachten : Die Senderliste aus dem Netz enthält die vollständigen Namen, also z.B. : ; ServusTV HD Deutschland -> wird auf 20 Zeichen gekürzt ; Einlesen der Fernsehliste.sdx (Kodierung=ANSI) in ein Array : _FileReadToArray(@ScriptDir & "\Fernsehliste.sdx", $aSDXList, $FRTA_NOCOUNT) For $iSDX = 0 To UBound($aSDXList) - 1 $sSDXChannel = StringStripWS(StringMid($aSDXList[$iSDX], 44, 8) & StringMid($aSDXList[$iSDX], 116, 12), 3) For $iNet = 0 To UBound($aNETList) - 1 $sNETChannel = StringStripWS(StringLeft($aNETList[$iNet], 20), 3) If $sSDXChannel = $sNETChannel Then _ArrayAdd($aSDXListNew, $aSDXList[$iSDX]) EndIf Next Next ; Neues Array mit den Treffern : _ArrayDisplay($aSDXListNew, "Treffer-Array") ; *** nur zur Anzeige beim Test ; ==> Array in eine neue Datei schreiben (ANSI) : $sFilePath = @ScriptDir & "\Fernsehliste-Neu.sdx" $hFileOpen = FileOpen($sFilePath, BitOR($FO_OVERWRITE, $FO_ANSI)) If $hFileOpen = -1 Then Exit MsgBox(BitOR(4096, 16), "Message :", "Es ist ein Fehler aufgetreten" & @CRLF) EndIf _FileWriteFromArray($hFileOpen, $aSDXListNew)
-
Man, du hast ja schneller eine Lösung parat als ich die Bordsuche oder google nutzen kann
Werte in Notepad++ passen, nur die Sendernamen haben im ChanSort keine Umlaute -> WDR D�sseldorf.
Im TV teste ich es nachher, muss jetzt erstmal zur Arbeit.
EDIT: die Sender werden im TV mit Umlauten angezeigt Ein paar Sender in fremder Sprache oder verschlüsselte haben sich sich eingeschlichen, weil sie namentlich mit den deutschen Sendern identisch sind. Alles in allem spart es aber eine Menge an Zeit gegenüber den gängigen Programmen! Habe noch ein paar Ideen dazu, möchte den Bogen aber nicht überspannen
Musashi vielen Dank noch einmal für deine Zeit und das Skript!
-
Sehe ich auch so, Ich wollte dieselwiesel nur nicht vorschlagen, die Standard-UDF diesbzgl. zu ändern.
Naja, ich sehe das so, dass das U in UserDefinedFunction nicht dazu da ist, um fleissig alles von diesem User zu Copypasten, sondern dass das U an den User gerichtet ist, der diese Funktion anwendet und dementsprechend auch diese Funktionen erweitert bzw. anpasst.
Und bei "Standard" bekomme ich regelmäßigst Zustände, denn das impliziert ja genau, möglichst die Finger davon zu lassen, irgendwer anderes wird die Funktion/Software/API schon geprüft haben und somit wird einem schon irgendwer anderer "den Arm aus der Sonne legen" wenn eine Änderung/Anpassung erforderlich ist.
Ich erwarte grundsätzlich von einem "Programmierer" , dass der mit seinem Handwerkszeug Programmiersprache umgehen kann. Und ja, warum auch nicht Copypasten? Wo ist das Problem aus bspw. _FileWriteFromArray() ein _FileWriteFromArrayCR() oder _FileWriteFromArrayLF() oder _FileWriteFromArrayANSI() zu erstellen oder die Funktion, wie von dir vorgeschlagen, mit entsprechend erweiterten Parametern auszustatten?! Parametererweiterung verändert den "Standard" dieser Funktion nicht, und wer dann ein Script einfach nur aus einem Forenbeitrag Copypastet ohne den dazugehörigen Thread zu lesen, dem gehört es auch nicht anders wenn das Script dann "nicht funktioniert" Wobei das "nicht funktioniert" nicht stimmt, denn es funktioniert ja, wenn man die beim Funktionsaufruf festgestellte Fehlermeldung liest (Hinweis auf Parameteranzahl) und die Funktion entsprechend der im Thread geposteten Erweiterung anpasst bzw nutzt.
Die mit dem Skript erzeugte Liste ist UTF8 und die "original" Liste ist ANSI.
Na dann sollte es doch funktionieren, wenn die Liste in ANSI in die Datei geschrieben wird....s.o.
Ich habe dazu in der Funktion _FileWriteFromArrayANSI() lediglich beim FileOpen() den Modus $FO_ANSI (512) = Use ANSI reading and writing mode. eingefügt.
Die Datei Fernsehliste-Neu.sdx wird jetzt in ANSI-Kodierung geschrieben. Btw. überprüfe ich bei Unklarheiten bei der Kodierung immer mit einem HEX-Editor, ein einfacher (imho guter) ist HxD.
AutoIt
Alles anzeigen#include <File.au3> #include <Array.au3> #include <Inet.au3> Local $sNETSource, $aNETList, $sNETChannel, $sPattern Local $aSDXList, $aSDXListNew[0], $sSDXChannel $sNETSource = BinaryToString(_INetGetSource("https://www.satindex.de/tv/1/1/0/", 0), 4) ; UTF8 ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sNETSource = ' & $sNETSource & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console $sPattern = '<div class="col freqx_1" >.*?">(.*?)<\/a><\/div>' $aNETList = StringRegExp($sNETSource, $sPattern, 3) ; unter col freqx_1 sind die Sendernamen gelistet ;_arraydisplay($aNETList) ; INFO : Aufbau der Fernsehliste.sdx ; ---------------------------------- ; Beispielzeile (Zeilenumbruch @LF) : ; SATCODX103Astra 1 (19.2E) TMPG20113030001ServusTV0192___ ______220002____________049140000101007_____________ HD Deutschl ; Die Sendernamen sind gesplittet, aber immer an festen Positionen. ; ==> max 8 Zeichen an Position 44..52 und (falls länger) max 12 Zeichen an Position 116..128 ; Der Sendername aus der .SDX-Datei ist max. 20 Zeichen lang, z.B. : ; ServusTV HD Deutschl ; Zu beachten : Die Senderliste aus dem Netz enthält die vollständigen Namen, also z.B. : ; ServusTV HD Deutschland -> wird auf 20 Zeichen gekürzt ; Einlesen der Fernsehliste.sdx in ein Array : Local $aSDXList, $aSDXListNew, $sSDXChannel _FileReadToArray(@ScriptDir & "\Fernsehliste.sdx", $aSDXList, $FRTA_NOCOUNT) For $iSDX = 0 To UBound($aSDXList) - 1 $sSDXChannel = StringStripWS(StringMid($aSDXList[$iSDX], 44, 8) & StringMid($aSDXList[$iSDX], 116, 12), 3) For $iNet = 0 To UBound($aNETList) - 1 $sNETChannel = StringStripWS(StringLeft($aNETList[$iNet], 20), 3) If $sSDXChannel = $sNETChannel Then _ArrayAdd($aSDXListNew, $aSDXList[$iSDX]) EndIf Next Next ; Neues Array mit den Treffern : _ArrayDisplay($aSDXListNew, "Treffer-Array") ; *** nur zur Anzeige beim Test ; ==> Array in eine neue Datei schreiben : _FileWriteFromArrayANSI(@ScriptDir & "\Fernsehliste-Neu.sdx", $aSDXListNew) Func _FileWriteFromArrayANSI($sFilePath, Const ByRef $aArray, $iBase = Default, $iUBound = Default, $sDelimiter = "|") Local $iReturn = 0 ; Check if we have a valid array as an input. If Not IsArray($aArray) Then Return SetError(2, 0, $iReturn) ; Check the number of dimensions is no greater than a 2d array. Local $iDims = UBound($aArray, $UBOUND_DIMENSIONS) If $iDims > 2 Then Return SetError(4, 0, 0) ; Determine last entry of the array. Local $iLast = UBound($aArray) - 1 If $iUBound = Default Or $iUBound > $iLast Then $iUBound = $iLast If $iBase < 0 Or $iBase = Default Then $iBase = 0 If $iBase > $iUBound Then Return SetError(5, 0, $iReturn) If $sDelimiter = Default Then $sDelimiter = "|" ; Open output file for overwrite by default, or use input file handle if passed. Local $hFileOpen = $sFilePath If IsString($sFilePath) Then $hFileOpen = FileOpen($sFilePath, $FO_OVERWRITE+$FO_ANSI ) If $hFileOpen = -1 Then Return SetError(1, 0, $iReturn) EndIf ; Write array data to file. Local $iError = 0 $iReturn = 1 ; Set the return value to true. Switch $iDims Case 1 For $i = $iBase To $iUBound If Not FileWrite($hFileOpen, $aArray[$i] & @CRLF) Then $iError = 3 $iReturn = 0 ExitLoop EndIf Next Case 2 Local $sTemp = "" For $i = $iBase To $iUBound $sTemp = $aArray[$i][0] For $j = 1 To UBound($aArray, $UBOUND_COLUMNS) - 1 $sTemp &= $sDelimiter & $aArray[$i][$j] Next If Not FileWrite($hFileOpen, $sTemp & @CRLF) Then $iError = 3 $iReturn = 0 ExitLoop EndIf Next EndSwitch ; Close file only if specified by a string path. If IsString($sFilePath) Then FileClose($hFileOpen) ; Return the results. Return SetError($iError, 0, $iReturn) EndFunc ;==>_FileWriteFromArray
-
Und bei "Standard" bekomme ich regelmäßigst Zustände, denn das impliziert ja genau, möglichst die Finger davon zu lassen, irgendwer anderes wird die Funktion/Software/API schon geprüft haben und somit wird einem schon irgendwer anderer "den Arm aus der Sonne legen" wenn eine Änderung/Anpassung erforderlich ist.
Mit Standard-UDF war lediglich gemeint, dass diese UDF zum Lieferumfang der AutoIt-Installation gehört, und bei Änderungen im Defaultverzeichnis nicht 'updatesicher' ist (daher mein Vorbehalt).
Ich wollte weder den Begriff Standard generell zum sakrosankten Qualitätsmerkmal erheben, noch implizieren, das eigene Denken einzustellen. Selbstverständlich darf und sollte man Code hinterfragen und bei Bedarf den eigenen Bedürfnissen anpassen - bin also völlig Deiner Meinung .
EDIT: die Sender werden im TV mit Umlauten angezeigt Ein paar Sender in fremder Sprache oder verschlüsselte haben sich eingeschlichen, weil sie namentlich mit den deutschen Sendern identisch sind. Alles in allem spart es aber eine Menge an Zeit gegenüber den gängigen Programmen! Habe noch ein paar Ideen dazu, möchte den Bogen aber nicht überspannen
Freut mich, dass es funktioniert .
Beschreibe einfach Deine neuen Ideen. Ob und wann der Bogen überspannt ist, können die Helfenden ja selbst entscheiden.
-
Mit Standard-UDF war lediglich gemeint, dass diese UDF zum Lieferumfang der AutoIt-Installation gehört, und bei Änderungen im Defaultverzeichnis nicht 'updatesicher' ist (daher mein Vorbehalt).
Ich wollte weder den Begriff Standard generell zum sakrosankten Qualitätsmerkmal erheben, noch implizieren, das eigene Denken einzustellen. Selbstverständlich darf und sollte man Code hinterfragen und bei Bedarf den eigenen Bedürfnissen anpassen - bin also völlig Deiner Meinung .Weiß ich doch alles gut
Habe noch ein paar Ideen dazu, möchte den Bogen aber nicht überspannen
Ich bin völlig Musashis Meinung! Immer her mit den Ideen, die sind imho auch viel wichtiger als die Umsetzung, da findet sich meist irgendwer
-
Moin,
bei der Anzahl der Sätze in den Dateien ist das kein Muss, es liefert aber trotzdem ein schönes Beispiel für den Einsatz von Maps:
AutoIt
Alles anzeigen; ---------------------------------- ; INFO : Aufbau der Fernsehliste.sdx ; ---------------------------------- ; Beispielzeile (Zeilenumbruch @LF) : ; SATCODX103Astra 1 (19.2E) TMPG20113030001ServusTV0192___ ______220002____________049140000101007_____________ HD Deutschl ; Die Sendernamen sind gesplittet, aber immer an festen Positionen. ; ==> max 8 Zeichen an Position 44..52 und (falls länger) max 12 Zeichen an Position 116..128 ; Der Sendername aus der .SDX-Datei ist max. 20 Zeichen lang, z.B. : ; ServusTV HD Deutschl ; Zu beachten : Die Senderliste aus dem Netz enthält die vollständigen Namen, also z.B. : ; ServusTV HD Deutschland -> wird auf 20 Zeichen gekürzt ; $sNETSource = BinaryToString(InetRead("https://www.satindex.de/tv/1/1/0/"), 4) ; UTF8 ; $sPattern = '<div class="col freqx_1" >.*?">(.*?)</a></div>' ; $sNETSource = FileRead(@ScriptDir & "\Satindex.txt") ; UTF8 Dim $sSatURL = "https://www.satindex.de/tv/1/1/0/" Dim $sSatFile = @ScriptDir & "\Satindex.txt" Dim $sSDXLst = @ScriptDir & "\Fernsehliste.sdx" Dim $sSDXNeu = @ScriptDir & "\Fernsehliste_neu.sdx" Dim $sPattern = '<div class="col freqx_1" ><a[^>]+>\K[^<]{1,20}' ; unter col freqx_1 sind die Sendernamen gelistet ; Einlesen der Satindex.txt in ein Map-Objekt : Dim $mSatNames[] ; Map ; For $sName In StringRegExp(FileRead($sSatFile), $sPattern, 3) For $sName In StringRegExp(BinaryToString(InetRead($sSatURL), 4), $sPattern, 3) $mSatNames[$sName] = 1 Next ; Einlesen der Fernsehliste.sdx in ein Array : Dim $sSDXName Dim $aSDXList = FileReadToArray($sSDXLst) ; Daten vergleichen und neues Array mit Treffern erstellen : Dim $aNewList[UBound($aSDXList)] Dim $iNew = 0 For $sLine In $aSDXList $sSDXName = StringStripWS(StringMid($sLine, 44, 8) & StringMid($sLine, 116, 12), 3) If MapExists($mSatNames, $sSDXName) Then $aNewList[$iNew] = $sLine $iNew += 1 EndIf Next ReDim $aNewList[$iNew] ; Neues Array anzeigen : Dim $hGui = GUICreate("Bereinigte Senderliste", 1000, 600) Dim $idFile = GUICtrlCreateMenu("&Datei") Dim $idSave = GUICtrlCreateMenuItem("&Speichern", $idFile) Dim $idExit = GUICtrlCreateMenuItem("&Beenden", $idFile) GUISetFont(9, Default, Default, "Consolas") Dim $idLV = GUICtrlCreateListView("Index|Senderdaten", 0, 0, 1000, 600) For $iLV = 0 To UBound($aNewList) - 1 GUICtrlCreateListViewItem($iLV & "|" & $aNewList[$iLV], $idLV) Next GUICtrlSendMsg($idLV, 0x101E, 1, -2) ; LVM_SETCOLUMNWIDTH GUISetState() While True Switch GuiGetMsg() Case -3 Exit Case $idExit Exit ; Case $idSave ; _Save() EndSwitch WEnd ; ==> Array in eine neue Datei schreiben (nicht getestet): Func _Save() Local $hFile = FileOpen($sSDXNeu, 514) ; $FO_OVERWRITE + $FO_ANSI If $hFile = -1 Then MsgBox(16, "", "Die Datei " & $sSDXNeu & " konnte nicht neu erstellt werden!") Return EndIf For $Line In $aNewList FileWrite($hFile, $Line & @LF) Next FileClose($hFile) EndFunc
Ich erwarte grundsätzlich von einem "Programmierer" , dass der mit seinem Handwerkszeug Programmiersprache umgehen kann. Und ja, warum auch nicht Copypasten? Wo ist das Problem aus bspw. _FileWriteFromArray() ein _FileWriteFromArrayCR() oder _FileWriteFromArrayLF() oder _FileWriteFromArrayANSI() zu erstellen oder die Funktion, wie von dir vorgeschlagen, mit entsprechend erweiterten Parametern auszustatten?!
Mein höchstpersönlicher Senf zu diesem Thema:
Wenn der "Programmierer" das locker meistert, hat er oft keinen Grund, die UDF zu benutzen. Wenn es z.B. darum geht, ein eindimensionales Array in eine Datei zu schreiben, sind das Einbinden der <Array.au3> und der Aufruf von _FileWriteFromArray() ziemlich unnötig. Es ist auch gut möglich, dass die Lernkurve von Einsteigern durch die vielen vorhandenen UDFs eher abgeflacht wird.
-
Es ist auch gut möglich, dass die Lernkurve von Einsteigern durch die vielen vorhandenen UDFs eher abgeflacht wird.
Da ist sicher etwas dran.
Ich gebe aber zu bedenken, dass viele Einsteiger möglicherweise gar nicht den Anspruch haben, "Programmierer" zu werden. Ihnen geht es häufig "nur" darum, mit kleineren Skripten ihre Alltagsaufgaben zu bewältigen. Genau dabei helfen die vorhandenen UDF's.
Auch viele Fortgeschrittene hätten sicher wenig Lust, die ganzen Räder (UDF's) selbst neu zu erfinden .
-