Spalten zusammenführen

Startseite Foren Deutsches LiveCode-Forum Spalten zusammenführen

Schlagwörter: 

Ansicht von 1 Antwort-Thema
  • Autor
    Beiträge
    • #47858
      Torsten
      Teilnehmer

        Hi,

        eigentlich wollte ich fragen, ob jemand eine schnelle Methode kennt, wie man mehrere Texte in eine gemeinsame Tabelle integrieren kann, in der jeder Text eine Spalte mit mehreren Zeilen darstellt.
        Ich hatte zuerst mit normalen String-Operationen gearbeitet, die aber bei der Größe der Daten (jeweils über 4000 Zeilen) zu langsam waren.
        Dann hab’ ich mit der Magie der Arrays gespielt und es hat sich mal wieder voll gelohnt, das Teil ist sehr schnell 🙂

        Anbei mein Handler, der als Funktion geschrieben ist, die beliebig viele Parameter akzeptiert und in die Reihefolge der Parameter als Reihenfolge der Spalten in der Tabelle verwendet.

        
        ---------------------
        function Lists2table
           ---------------------
           -- Erzeugt aus mehreren Texten eine Tabelle mit mehreren Spalten
           -- USE: put Lists2table(field "Eins", field "Zwei", field "Drei") into field "Tabelle"
           -- WICHTIG: die Texte dürfen in jeder Zeile entweder keine oder immer die gleiche Anzahl von Tabs haben 
           
        ## Speichere die Parameter nach ihrer Reihenfolge in einem Array: 1. Paramter = tArray[1], etc.
           ## Parameter 1 = Spalte 1
        
           repeat with i = 1 to the paramCount 
              put param(i) into tArray[i]
           end repeat
           
           ## Finde heraus, welche Spalte die meisten Zeilen enthält, damit nachher alle Spalten gleich lang sind
        
           repeat for each key tKey in tArray
              put tKey & tab & the number lines in tArray[tKey] & cr after tLengthList
           end repeat
           sort lines of tLengthList numeric descending
           put trueword 2 of line 1 of tLengthList into tMaxLines --> maximale Zeilenanzahl der Tabelle
           
           ## Erzeuge für jede Zeile der Tabelle die entsprechenden Spalten aus den Paramtertexten
        
           repeat for each key tList in tArray
              put empty into tLineCounter
              repeat for each line tLine in tArray[tList]
                 add 1 to tLineCounter
                 put tLine into tListArray[tLineCounter][tList]
              end repeat
        
              ## wenn eine Liste kürzer ist als die längste, dann erzeuge leere Zellen pro Zeile 
        
              repeat while tLineCounter < tMaxLines
                 add 1 to tLineCounter
                 put empty into tListArray[tLineCounter][tList]
              end repeat
           end repeat
           
           ## Erzeuge eine mehrspaltige Tabelle und sortiere sie nach der Zeilenindex-Spalte
        
           repeat for each key tIndex in tListArray
              put empty into tRow
              repeat with i = 1 to the paramCount 
                 put tListArray[tIndex][i] & tab after tRow
              end repeat
              delete last char of tRow
              put tIndex & tab & tRow & cr after tTable
           end repeat
           set itemdelimiter to tab
           sort lines of tTable numeric ascending by item 1 of each
           
           ## Entferne die Zeilenindex-Spalte
        
           repeat for each line tLine in tTable
              delete item 1 of tLine
              put tLine & cr after tCleanTable
           end repeat
           
           ## Gib die fertige Tabelle zurück
        
           return tCleanTable
           
        end Lists2table
        

        Happy Coding
        Torsten

      • #47859
        Klaus Major
        Administrator

          Ja, “repeat for each” und Arrays sind unschlagbar schnell in LC!

          Da die Engine mit jeder Version von LC immer etwas “strenger” ist, empfehle ich, solche Kleinigkeiten zu vermeiden:

          ...
          repeat for each key tKey in tArray
                ## put tKey & tab & the number lines in tArray[tKey] & cr after tLengthList
                put tKey & tab & the number OF lines in tArray[tKey] & cr after tLengthList
          end repeat
          ...
          • #47860
            Torsten
            Teilnehmer

              Hej, danke, den habe ich übersehen (schreibe ich sonst immer rein, komisch, dass es überhaupt funktioniert…).

              Habe beim drüberschauen noch eine kürzere Form gefunden:

              
               put 0 into tMaxLines
                 repeat for each key tKey in tArray
                    if  the number of lines in tArray[tKey] > tMaxLines then put the number of lines in tArray[tKey] into tMaxLines
                 end repeat
              
                 
        Ansicht von 1 Antwort-Thema
        • Du musst angemeldet sein, um auf dieses Thema antworten zu können.