Ini-Wert eines Schlüssels sortieren

  • Alte Aufgabe: gelöst!

    Spoiler anzeigen

    Hallo zusammen.

    Ich brauch wieder eure Hilfe eine sinnvolle Lösung zu erarbeiten.
    Hab ne schöne Aufgabe von meinem Kollegen bekommen... X(
    Ich habe eine Exceltabelle. Die soll spaltenweise abgearbeitet werden (mit unterschiedlichen Anzahl von Zeilen, einfach bis zum Ende jeweils)
    Ein "Datensatz" umfasst immer 9 Zeilen. Zeile 1 und 2 sind egal. Zeile 3 - 9 sind wichtig. Die Zeilen bestehen nur aus Zahlen.
    Zeile 10 ist dann Zeile 1 des zweiten Datensatzes.
    Ich möchte diese Datensätze in einer Ini-Datei ordnen.
    Die Sektionen zählen ab 1 hoch. Also mit folgendem Aufbau:

    Spoiler anzeigen


    x=Zahl einer Zeile, die mit einem Komma getrennt werden; y=Zahl der letzten Zeile eines Datensatze
    -------------------------------------------------------------------------------------
    [1]
    x, x, x, x, x, x
    y
    [2]
    x, x, x, x, x, x
    y
    [3]
    x, x, x, x, x, x
    y
    ...

    Und wenn die Spalte abgearbeitet ist gehts einfach weiter mit der nächsten Spalte bis zum Ende der Datei.
    Das ist fest: es sind 55 Spalten.

    Vielen Dank für eure Hilfe!

    Lieben Gruß,
    Xethria

    Neue Aufgabe:

    Neue Aufgabe dazu.

    2 Mal editiert, zuletzt von Xethria (31. Mai 2010 um 13:27) aus folgendem Grund: Neue Aufgabe dazu.

  • Versuch ich doch gerne.
    Nur Beispieldaten kann ich gerade nicht hochladen, da ich an einem PC bin ohne Office und Rechte was zu installieren.

    Spalte A hat zum Beispiel 900 Zeilen, die gefüllt sind mit Zahlen.
    Ein "Paket" (Daten, die zusammengehören, damit sie für mich logisch sind) besteht immer aus aufeinanderfolgenden 9 Zeilen (also 9 Zellen).
    Paket 1: A1, A2, A3, A4, A5, A6, A7, A8 und A9.
    Paket 2: A10, A11, A12, A13, A14, A15, A16, A17 und A18.
    Paket 3: A19, A20,... bis die Spalte abgearbeitet ist. Die Anzahl der Zeilen in einer Spalte ist also genau durch 9 teilbar.

    Ich möchte nun diese Zellen mit den Zahlen in einer Ini-Datei ordnen, wo der Sektor (ich nehme an das, was in "[ ]" ist) nur eine Zahl ist.
    Der erste Sektor heisst dann: [1], der zweite [2], der dritte [3], usw.
    Unterhalb des Sektors folgen dann die Zahlen aus den Zellen, getrennt durch ein Komma.
    Beispiel: A1= 34, A2= 45, A3=20, A4= 12, A5= 11, A6= 09, A7= 01, A8= 03 und A9=29; A10= 23, A11= 49, A12= 01, A13= 27, A14= 18, A15= 12, A16= 35, A17= 32 und A18= 26.
    A1 und A2, sowie A10 und A11 sollen nicht beachtet werden.
    Die Ini sieht dann so aus:

    [1]
    20, 12, 11, 09, 01, 03
    29
    [2]
    01, 27, 18, 12, 35, 32
    26
    [3]
    ...

    • Offizieller Beitrag

    OK, das ist kein Problem.
    Jeder 9-er Block wird dann durch die Sektionsnummer dargestellt.
    Wobei in einer INI die Darstellung so erfolgt:

    Code
    [sektion]
    schlüssel=wert

    Ich würde dir also folgendes empfehlen:

    Code
    [1]
    Block=20, 12, 11, 09, 01, 03
    Last=29
    [2]
    Block=01, 27, 18, 12, 35, 32
    Last=26

    Ich mach dir mal ein Bsp. und poste es dann.

    • Offizieller Beitrag

    Hi,
    hier die Lösung:

    Spoiler anzeigen
    [autoit]

    Local $sFilePath = 'Pfad.xls'
    Local $sINIPath = 'Pfad.ini'

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

    Local $oExcel = ObjCreate("Excel.Application")
    $oExcel.Visible = 0
    Local $oBook = $oExcel.Workbooks.Open($sFilePath)
    Local $AnzSpalten = $oBook.Worksheets(1).UsedRange.Columns.Count

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

    Local $start = 'A1'
    Local $sINI = ''
    Local $count

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

    For $i = 0 To $AnzSpalten-1
    $j = 0
    $count = 0
    While True
    $val = $oExcel.Range($start).Offset($j, $i).Value
    If $val = '' Then ExitLoop
    $count += 1
    If $count = 10 Then
    $count = 1
    $sINI = StringTrimRight($sINI, 1) & @CRLF
    EndIf
    If $count > 2 Then $sINI &= $val & ','
    $j += 1
    WEnd
    $sINI = StringTrimRight($sINI, 1) & @CRLF
    Next
    $oExcel.DisplayAlerts = False
    $oExcel.Application.Quit

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

    Local $aINI = StringSplit($sINI, @CRLF, 1)
    Local $sData

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

    For $i = 1 To $aINI[0] -1
    $last = StringRight($aINI[$i], StringLen($aINI[$i])-StringInStr($aINI[$i], ',', 1, -1))
    $sData = 'Block=' & StringTrimRight($aINI[$i], StringLen($last)+1) & @LF & 'Last=' & $last
    IniWriteSection($sINIPath, $i, $sData)
    Next

    [/autoit]