Songliste bearbeiten

  • Hallo,

    ich habe folgendes Problem.
    Ich muß eine grosse Songliste bearbeiten.
    Sieht so aus:

    Spoiler anzeigen


    Dancing Queen;ABBA
    Fernando;ABBA
    Super Trouper;ABBA
    Bohemian rhapsody;Queen
    Stairway to heaven;Led Zeppelin
    Music;Miles John
    Child in time;Deep Purple
    Tage wie diese;Die Toten Hosen
    Hotel California;Eagles
    Wish you were here;Pink Floyd
    Brothers in arms;Dire Straits
    Nothing else matters;Metallica
    The rose;Midler Bette
    Geboren um zu leben;Unheilig
    Smoke on the water;Deep Purple
    Hells bells;AC/DC
    Am Fenster;City
    Highway to hell;AC/DC

    Folgendes:
    Aus dieser Hitliste (Top 1000) muß ich sagen können: ABBA ist 3x mit diesen Songs vertreten)
    Ich muß also aus dieser Liste Interpreten filtern.
    Die Liste filtert zur Zeit alle doppelten Interpreten-Einträge
    (das klappt... also ABBA, AC/DC...)

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $sSongliste = FileOpenDialog("Neue Liste", @ScriptDir, "Songliste (*.txt)")
    $sInterpretFile = "Interpreten.txt"

    [/autoit] [autoit][/autoit] [autoit]

    Local $aSongs, $aInterpreten_UNIQUE
    _FileReadToArray($sSongliste, $aSongs)
    Local $aInterpreten[$aSongs[0]]
    For $i = 1 To $aSongs[0]
    $aInfo = StringSplit($aSongs[$i], ";", 3)
    If UBound($aInfo) <> 2 Then ContinueLoop
    $aInterpreten[$i - 1] = $aInfo[1]

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit]

    $aInterpreten_UNIQUE = _ArrayUnique($aInterpreten)
    _ArrayDisplay($aInterpreten_UNIQUE)

    [/autoit] [autoit][/autoit] [autoit]

    _FileWriteFromArray($sInterpretFile, $aInterpreten_UNIQUE)

    [/autoit]

    So nun zum Problem:

    Ich bräuchte zusätzlich eine Liste mit der Anzahl der Interpreten:
    Beipiel: Der Interpret ist z.B. 3x mal in der Liste vertreten.
    ABBA (3)
    AC/DC (3)
    Deep Purple (2)

    Also: Welcher Interpret ist wieviel mal in der TOP 1000 vertreten und mit welchen Songs.


    Super wäre natürlich auch eine Liste bei den mehrfach Interpreten
    dass die Songs mit aufgelistet werden.

    Beispiel:

    ABBA (3x in der Liste)
    Dancing Queen (Platz 1)
    Fernando (Platz 2)
    Super Trouper (Platz 3)
    AC/DC (2x in der Liste)
    Hells Bells (Platz 16)
    Highway to hell;AC/DC (Platz 18)
    Deep Purple (2x in der Liste)
    ...

    Würd mich freuen wenn Ihr mir daben helfen könnt.

    Liebe Grüße
    Ilse ;)

    3 Mal editiert, zuletzt von Ilse (31. Juli 2013 um 12:01)

  • Wenn ich mich nicht ganz irre, könntest du die Funktion Arrayunique auch selber schreiben.

    Ungetestet
    [autoit]

    Local $aArray[1][2], $aIndexes
    For $i = 0 To UBound($aInterpreten)
    $aIndexes = _ArrayFindAll($aArray, $aInterpreten[$i])
    If @error = 1 Then
    If $i = 0 Then
    $aArray[$i][0] = $aInterpreten[$i]
    $aArray[$i][1]++
    Else
    ReDim $aArray[$i + 1]
    $aArray[$i][0] = $aInterpreten[$i]
    $aArray[$i][1]++
    EndIf
    Else
    $aArray[$aIndexes][1]++
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aArray)
    If $aArray[$i][1] > 1 Then
    ConsoleWrite($aArray[$i][0] & "(" & $aArray[$i][0] & "x)" & @CR)
    ConsoleWrite($aArray[$i][0] & @CR)
    Else
    ConsoleWrite($aArray[$i][0] & @CR)
    EndIf
    Next

    [/autoit]

    Dann kannst du hiernach ja einfach das Array für die Ausgabe in eine andere Datei oder was auch immer durchlaufen und dir eine formatierte benötigte Ausgabe erstellen ...

    Grüße Yaerox

    Grüne Hölle

  • Hallo,

    merci, aber das Script funktioniert irgendwie nicht. (Fehler im Loop...)

    hier nochmal kpl. mit Änderungen von mir

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $sSongliste = FileOpenDialog("Neue Liste", @ScriptDir, "Songliste (*.txt)")
    $sInterpretFile = "Interpreten.txt"
    Global $aInterpreten
    Local $aArray[1][2], $aIndexes
    For $i = 0 To UBound($aInterpreten)
    $aIndexes = _ArrayFindAll($aArray, $aInterpreten[$i])
    If @error = 1 Then
    If $i = 0 Then
    $aArray[$i][0] = $aInterpreten[$i]
    $aArray[$i][1]++
    Else
    ReDim $aArray[$i + 1]
    $aArray[$i][0] = $aInterpreten[$i]
    $aArray[$i][1]++
    EndIf
    Else
    $aArray[$aIndexes][1]++
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aArray)
    If $aArray[$i][1] > 1 Then
    ConsoleWrite($aArray[$i][0] & "(" & $aArray[$i][0] & "x)" & @CR)
    ConsoleWrite($aArray[$i][0] & @CR)
    Else
    ConsoleWrite($aArray[$i][0] & @CR)
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    @ Xenobiologist

    habe kein Excel


    Liebe Grüße
    Ilse ;)

  • Wie gesagt, der Code war ungetestet ;)

    Ich hab eig. nciht wirklich die Zeit das nebenbei zu machen, aber lad doch mal ne kleine Testdatei dazu hoch dann kann man das auch ausprobieren ^^

    #Edit: OpenOffice -> kostenfreie Alternative zu Office, da gibt es auch ein "Excel" ...

    Grüße Yaerox

    Grüne Hölle

  • Ich habe keinen Zugriff auf diesen Link ... richtig verlinkt? Sonst mach n Spoiler und nen Code-Block oder sowas ...

    #Edit: kurioser weise wird mir der Link nichtmals mehr angezeigt ^^

    Grüße Yaerox

    Grüne Hölle

    • Offizieller Beitrag

    So geht's:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $sFilename = @ScriptDir & '\Hitparade2.txt'
    $aInterpreten = StringRegExp(FileRead($sFilename), '.+;(.+)', 3)
    ;~ _ArrayDisplay($aInterpreten)
    $aModal = _ArrayModal($aInterpreten)
    _ArrayDisplay($aModal)

    [/autoit] [autoit][/autoit] [autoit]

    Func _ArrayModal($w)
    Local Static $oDictionary = ObjCreate('Scripting.Dictionary')
    $oDictionary.CompareMode = 1
    For $i = 0 To UBound($w) - 1
    If $oDictionary.Exists($w[$i]) Then
    $oDictionary.Item($w[$i]) = $oDictionary.Item($w[$i]) + 1
    Else
    $oDictionary.Add($w[$i], 1)
    EndIf
    Next
    Local $aOut[$oDictionary.Count][2], $i = 0, $colKeys
    $colKeys = $oDictionary.Keys
    For $strKey In $colKeys
    $aOut[$i][0] = $strKey
    $aOut[$i][1] = $oDictionary.Item($strKey)
    $i += 1
    Next
    $oDictionary = ''
    _ArraySort($aOut, 1, 0, 0, 1)
    Return $aOut
    EndFunc ;==>_ArrayModal

    [/autoit]
  • Die richtige ausgabe kannst dir ja sicherlich selbst schreiben ;) Habs jetzt doch ebend nebenbei gemacht. Viel Spaß.

    So gehts
    [autoit]

    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $aTracks
    Local $aArray[1][2]
    Local $aIndexes
    Local $sTracklist

    [/autoit] [autoit][/autoit] [autoit]

    $sTracklist = FileOpenDialog("Select Tracklist...", @ScriptDir, "Tracklist (*.txt)")
    _FileReadToArray($sTracklist, $aTracks)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aTracks) - 1
    $aSplit = StringSplit($aTracks[$i], ";")
    If $i = 1 Then
    $aArray[$i - 1][0] = $aSplit[1] & ";" & $aSplit[2]
    $aArray[$i - 1][1] = $aSplit[2]
    Else
    $aIndexes = _ArrayFindAll($aTracks, $aSplit[2], 0, 0, 0, 0, 2)
    If $aIndexes = -1 Then
    ReDim $aArray[$i + 1][2]
    $aArray[$i - 1][0] = $aSplit[1] & ";" & $aSplit[2]
    $aArray[$i - 1][1] = $aSplit[2]
    Else
    $aArray[$aIndexes][1] = $aArray[$aIndexes][1] + 1
    EndIf
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aArray) - 1
    If $aArray[$i][1] <> "" Then
    $aIndexes = _ArrayFindAll($aArray, $aArray[$i][1], 0, 0, 0, 0, 2)

    [/autoit] [autoit][/autoit] [autoit]

    If UBound($aIndexes) > 0 Then
    ConsoleWrite($aArray[$i][1] & "(" & UBound($aIndexes) & "x)" & @CR & "--------------------" & @CR)
    For $y = 0 To UBound($aIndexes) - 1
    ConsoleWrite($aArray[$aIndexes[$y]][0] & @CR)
    $aArray[$aIndexes[$y]][0] = ''
    $aArray[$aIndexes[$y]][1] = ''
    Next
    ConsoleWrite(@CR)
    EndIf
    EndIf
    Next

    [/autoit]

    Grüße Yaerox

    Grüne Hölle

  • Hallo Oscar,

    vielen Dank.
    Habe das noch etwas umgebaut. (Dialog)
    Ein kleines Problem in Zeile 10!

    ich möchte gerne die Arrays in die Datei schreiben!
    Da kommt leider noch nichts dann.

    Super

    Liebe Grüße
    Ilse ;)

  • Hallo YaeroxXO,

    auch dir herzlichen Dank für die Mühe.
    Console write gibt alles aus was ich brauche.

    Gibt es irgendeine Möglichkeit das ganze zu sortieren?
    Das wäre wichtig. Ich meine der Interpret der die meisten Plazierungen hat steht oben!

    ;) Ilse

  • Man könnte das $aArray Feld durchlaufen und die jeweilige Anzahl eines Interpreten zählen, in ein 2D Array Schreiben (Interpret | Anzahl) das lässte dir dann sortieren und gehst mit der Ausgabe genau so vor wie bisher, nur musste bei der äußeren Ausgabeschleife halt das neue Array angeben. Das könntest du auch theoretisch schon direkt in der ersten Schleife mit einbinden, damit solltest ein paar MS/S Zeit spaaren.

    Ich hab jetzt leider keine Zeit mehr und habe gleich Feierabend, könnte dir u.U. morgen sonst noch mal helfen, aber grundsätzlich ist das die selbe Methode wie ich die schon genutzt habe.

    Nebenbei, hab ich mir Oscars Beispiel mal angeschaut ^^
    Was performance Aspekte angeht bin ich auch immer vorsichtig mit meinen Skripten, ich denke es gibt hier einige die es viel besser hinkriegen, aber ich konnte bisher alle Ziele erreichen, wenn auch auf einem vll. aufwendigeren Wege, aber nunja ... worauf ich hinaus will, wenn dir Sachen wie Speicher etc. wichtig sind, dann wird die auffallen das meins mehr braucht ;) Sofern dich sowas in deinen Skripten interessiert ^^

    Grüße Yaerox

    Grüne Hölle

  • Hallo,

    also nochmals herzlichen Dank.
    Ich bin die ganze Zeit dabei das ganze noch in deine Datei zu bekommen.

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    _FileWriteFromArray($sInterpretFile, ($aArray[$i][1] & "(" & UBound($aIndexes) & "x)" & @CR & "--------------------" & @CR))

    [/autoit]

    kommt leider nichts an.

    Spoiler anzeigen
    [autoit]


    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $aTracks
    Local $aArray[1][2]
    Local $aIndexes
    Local $sTracklist

    [/autoit] [autoit][/autoit] [autoit]

    $sTracklist = FileOpenDialog("Select Tracklist...", @ScriptDir, "Tracklist (*.txt)")
    _FileReadToArray($sTracklist, $aTracks)

    [/autoit] [autoit][/autoit] [autoit]

    $sInterpretFile = "Interpreten-1000.txt"

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aTracks) - 1
    $aSplit = StringSplit($aTracks[$i], ";")
    If $i = 1 Then
    $aArray[$i - 1][0] = $aSplit[1] & ";" & $aSplit[2]
    $aArray[$i - 1][1] = $aSplit[2]
    Else
    $aIndexes = _ArrayFindAll($aTracks, $aSplit[2], 0, 0, 0, 0, 2)
    If $aIndexes = -1 Then
    ReDim $aArray[$i + 1][2]
    $aArray[$i - 1][0] = $aSplit[1] & ";" & $aSplit[2]
    $aArray[$i - 1][1] = $aSplit[2]
    Else
    $aArray[$aIndexes][1] = $aArray[$aIndexes][1] + 1
    EndIf
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aArray) - 1
    If $aArray[$i][1] <> "" Then
    $aIndexes = _ArrayFindAll($aArray, $aArray[$i][1], 0, 0, 0, 0, 2)

    [/autoit] [autoit][/autoit] [autoit]

    If UBound($aIndexes) > 0 Then
    ConsoleWrite($aArray[$i][1] & "(" & UBound($aIndexes) & "x)" & @CR & "--------------------" & @CR)
    For $y = 0 To UBound($aIndexes) - 1
    ConsoleWrite($aArray[$aIndexes[$y]][0] & @CR)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $aArray[$aIndexes[$y]][0] = ''
    $aArray[$aIndexes[$y]][1] = ''
    Next
    ConsoleWrite(@CR)
    EndIf
    EndIf
    Next
    _FileWriteFromArray($sInterpretFile, ($aArray[$i][1] & "(" & UBound($aIndexes) & "x)" & @CR & "--------------------" & @CR))

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    Kann jetzt nicht mehr denken....

    Liebe Grüße
    Ilse ;)

    • Offizieller Beitrag

    Hier meine Version mit Speicherfunktion:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $sFilename = @ScriptDir & '\Hitparade2.txt'
    $sSaveFile = @ScriptDir & '\Interpreten-1000.txt'
    $aInterpreten = StringRegExp(FileRead($sFilename), '.+;(\V+)', 3)
    ;~ _ArrayDisplay($aInterpreten)
    $aModal = _ArrayModal($aInterpreten)
    _ArrayDisplay($aModal)
    $hFile = FileOpen($sSaveFile, 2)
    If $hFile <> -1 Then
    For $i = 0 To UBound($aModal) - 1
    FileWriteLine($hFile, $aModal[$i][0] & ';' & $aModal[$i][1])
    Next
    FileClose($hFile)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func _ArrayModal($w)
    Local Static $oDictionary = ObjCreate('Scripting.Dictionary')
    $oDictionary.CompareMode = 1
    For $i = 0 To UBound($w) - 1
    If $oDictionary.Exists($w[$i]) Then
    $oDictionary.Item($w[$i]) = $oDictionary.Item($w[$i]) + 1
    Else
    $oDictionary.Add($w[$i], 1)
    EndIf
    Next
    Local $aOut[$oDictionary.Count][2], $i = 0, $colKeys
    $colKeys = $oDictionary.Keys
    For $strKey In $colKeys
    $aOut[$i][0] = $strKey
    $aOut[$i][1] = $oDictionary.Item($strKey)
    $i += 1
    Next
    $oDictionary = ''
    _ArraySort($aOut, 1, 0, 0, 1)
    Return $aOut
    EndFunc ;==>_ArrayModal

    [/autoit]
  • Hallo Oscar,

    merci, hab das ganze mit FileOpen gemacht!

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $sFilename = FileOpenDialog("Select Tracklist...", @ScriptDir, "Tracklist (*.txt)")
    $sSaveFile = @ScriptDir & '\Interpreten-1000.txt'
    $aInterpreten = StringRegExp(FileRead($sFilename), '.+;(\V+)', 3)
    ;~ _ArrayDisplay($aInterpreten)
    $aModal = _ArrayModal($aInterpreten)
    _ArrayDisplay($aModal)
    $hFile = FileOpen($sSaveFile, 2)
    If $hFile <> -1 Then
    For $i = 0 To UBound($aModal) - 1
    FileWriteLine($hFile, $aModal[$i][0] & ';' & $aModal[$i][1])
    Next
    FileClose($hFile)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func _ArrayModal($w)
    Local Static $oDictionary = ObjCreate('Scripting.Dictionary')
    $oDictionary.CompareMode = 1
    For $i = 0 To UBound($w) - 1
    If $oDictionary.Exists($w[$i]) Then
    $oDictionary.Item($w[$i]) = $oDictionary.Item($w[$i]) + 1
    Else
    $oDictionary.Add($w[$i], 1)
    EndIf
    Next
    Local $aOut[$oDictionary.Count][2], $i = 0, $colKeys
    $colKeys = $oDictionary.Keys
    For $strKey In $colKeys
    $aOut[$i][0] = $strKey
    $aOut[$i][1] = $oDictionary.Item($strKey)
    $i += 1
    Next
    $oDictionary = ''
    _ArraySort($aOut, 1, 0, 0, 1)
    Return $aOut
    EndFunc ;==>_ArrayModal

    [/autoit]

    Das speichern klappt.
    Die Mischung von dir und YaeroxXO
    wäre eigentlich die perfekte Lösung.
    Da wären die Titel mit drin.

    Nochmals vielen Dank!

    ;) Liebe Grüße
    Ilse

  • Gerne. Wärst du so lieb und setzt den Thread noch auf gelöst?

    Ersten post editieren, häckchen bei gelöst setzen und Änderungen speichern :)

    Grüße Yaerox

    Grüne Hölle

  • Hallo YaeroxXO,

    schön dass du dich wieder meldest.
    Ich hatte gestern noch probiert das ganze zu sortieren.
    Hat aber nicht geklappt.
    Würd mich freuen, wenn du mir dabei noch helfen könntest.

    Liebe Grüße
    Ilse ;)

  • Edit: Ich dachte ich hätte was von Listview's gelesen. Ich bin verwirrt ?(
    Alles was du brauchst ist in der Hilfe:

    [autoit]

    _GUICtrlListView_SortItems()

    [/autoit]

  • Viel Spaß damit :)

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $aTracks
    Local $aArray[1][2]
    Local $aArray_BU
    Local $aArray2[1][2]
    Local $aIndexes
    Local $sTracklist
    Local $hFile

    [/autoit] [autoit][/autoit] [autoit]

    $sTracklist = FileOpenDialog("Select Tracklist...", @ScriptDir, "Tracklist (*.txt)")
    _FileReadToArray($sTracklist, $aTracks)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($aTracks) - 1
    $aSplit = StringSplit($aTracks[$i], ";")
    If $i = 1 Then
    $aArray[$i - 1][0] = $aSplit[1] & ";" & $aSplit[2]
    $aArray[$i - 1][1] = $aSplit[2]
    Else
    ReDim $aArray[$i + 1][2]
    $aArray[$i - 1][0] = $aSplit[1] & ";" & $aSplit[2]
    $aArray[$i - 1][1] = $aSplit[2]
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $aArray_BU = $aArray

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To UBound($aArray) - 1
    If $aArray[$i][1] <> "" Then
    $aIndexes = _ArrayFindAll($aArray, $aArray[$i][1], 0, 0, 0, 0, 2)

    [/autoit] [autoit][/autoit] [autoit]

    If UBound($aIndexes) > 0 Then
    ReDim $aArray2[$i + 1][2]
    $aArray2[$i][0] = $aArray[$i][1]
    $aArray2[$i][1] = UBound($aIndexes)
    For $y = 0 To UBound($aIndexes) - 1
    $aArray[$aIndexes[$y]][0] = ''
    $aArray[$aIndexes[$y]][1] = ''
    Next
    EndIf
    EndIf
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _ArraySort($aArray2, 2, 0, 0, 1)

    [/autoit] [autoit][/autoit] [autoit]

    $hFile = FileOpen("Sortierte_Hitliste.txt", 1)
    For $i = 0 To UBound($aArray2) - 1
    If $aArray2[$i][1] <> "" Then
    $aIndexes = _ArrayFindAll($aArray_BU, $aArray2[$i][0], 0, 0, 0, 0, 2)

    [/autoit] [autoit][/autoit] [autoit]

    If UBound($aIndexes) > 0 Then
    FileWriteLine($hFile, $aArray_BU[$aIndexes[0]][1] & "(" & UBound($aIndexes) & "x)" & @CRLF & "--------------------" & @CRLF)
    For $y = 0 To UBound($aIndexes) - 1
    FileWriteLine($hFile, $aArray_BU[$aIndexes[$y]][0] & @CRLF)
    $aArray_BU[$aIndexes[$y]][0] = ''
    $aArray_BU[$aIndexes[$y]][1] = ''
    Next
    FileWriteLine($hFile, @CRLF)
    EndIf
    EndIf
    Next
    FileClose($hFile)

    [/autoit]

    Grüße Yaerox

    Grüne Hölle