2-Dimensionales Array aus zwei unterschiedlichen Quellen

  • Ja ich schon wieder...

    ich wollt mal frage ob mir jemand mit einen Tip oder Beispiel bei meinem Problem auf die Sprünge helfen könnte.
    Was ich grad machen möchte ist folgendes. Es gibt eine Exceldatei die ich Zeilenweise auslesen möchte
    mit $aArray = _ExcelReadArray($oExcel, 2, 1, 31)
    und dazu parallel eine weiter Varialble auslesen möchte in der die Spaltennamen aus der SQL DB stehen
    $aArray1 = StringSplit( "WONUMMER, WOTYP, TELPLUSAUFTRAG, ORDER....
    um letztlich in der Datenbank dann anhand zB des SQL Spaltennamens WONUMMER den ersten eintrag aus der Exceltabelle
    zuzuordnen.

    Ich hab schon viel rumprobiert.... aber ich merke immer wieder ich habs wohl noch nicht begriffen. :(

    hier erstmal mein letzter Versuch:

    Spoiler anzeigen
    [autoit]

    #include <Excel.au3>
    #include <array.au3>

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

    _Excel_File_Read("EuF_090423.xls")

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

    Func _Excel_File_Read($input_File_Name)

    Local $sFilePath1 = @ScriptDir & "\" & $input_File_Name;This file should already exist

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

    Local $r=1
    Local $aArray1 = StringSplit( "WONUMMER, WOTYP, TELPLUSAUFTRAG, ORDERENTRY, TERMIN, TIMESLOT, TECHNIKER ,KDNR, VORNAME, NACHNAME, PLZ, ORT, STRASSE, HSNR, HSNRZUSATZ, RFNRPRIVAT ,UNITYRFNR, SONSTIGERFNR, WEOBJEKT, HSKOMMENTAR, FIBERNOTE, CLINE, ADRESSEUP ,L4AUSBAUTYP, L4AUSBAUDATUM , L4NETZSTRUKTUR, SCREAMBLEDID, INSTHARDWARE, F2KOMMENTAR, AKTIVEHSI", ",")

    Local $oExcel = _ExcelBookOpen($sFilePath1, 0)

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

    Local ;Direction is Horizontal

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

    Dim $sArrayString = _ArrayToString( $aArray,";", 0, 31 )

    Local $aArray=StringSplit($sArrayString,";")

    For $i=1 To $aArray[0]

    For $r=1 To $aArray1[0]

    MsgBox(0,"","Der Excelwert: " & $aArray[$i] & " und der SQL Wert: " & $aArray1[$r] )

    next

    Next

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

    _ExcelBookClose($oExcel) ; And finally we close out

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

    EndFunc

    [/autoit]

    Dann hab ich es nochmal nochmal so probiert was meinen wunsch schon entsprach blos zum schluß kommt ein Fehler.
    ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    hier wäre dann noch dieses Script.

    Spoiler anzeigen
    [autoit]

    #include <Excel.au3>
    #include <array.au3>

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

    _Excel_File_Read("EuF_090423.xls")

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

    Func _Excel_File_Read($input_File_Name)

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

    Local $sFilePath1 = @ScriptDir & "\" & $input_File_Name;This file should already exist

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

    Local $r=1
    Local $aArray1 = StringSplit( "WONUMMER, WOTYP, TELPLUSAUFTRAG, ORDERENTRY, TERMIN, TIMESLOT, TECHNIKER ,KDNR, VORNAME, NACHNAME, PLZ, ORT, STRASSE, HSNR, HSNRZUSATZ, RFNRPRIVAT ,UNITYRFNR, SONSTIGERFNR, WEOBJEKT, HSKOMMENTAR, FIBERNOTE, CLINE, ADRESSEUP ,L4AUSBAUTYP, L4AUSBAUDATUM , L4NETZSTRUKTUR, SCREAMBLEDID, INSTHARDWARE, F2KOMMENTAR, AKTIVEHSI", ",")

    Local $oExcel = _ExcelBookOpen($sFilePath1, 0)

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

    Local $aArray = _ExcelReadArray($oExcel, 4, 1, 31) ;Direction is Horizontal

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

    Dim $sArrayString = _ArrayToString( $aArray,";", 0, 31 )

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

    Local $aArray=StringSplit($sArrayString,";")
    ;Local $aArray1=StringSplit($sArrayString1,"")

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

    For $i=1 To $aArray[0]

    MsgBox(0,"","Der Excelwert: " & $aArray[$i] & " und der SQL Wert: " & $aArray1[$r] )

    $r+=1

    Next

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

    _ExcelBookClose($oExcel) ; And finally we close out

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

    EndFunc

    [/autoit]

    Wäre nett wen mir jemand wieder auf den Weg helfen würde.

    Gruß Jan

  • Hallo JanausSm,

    lass dir doch mal die Arrays mit _ArrayDisplay anzeigen, vielleicht erkennst du so ja den Fehler (unterschiedliche Anzahl Einträge :?: )

    mfg (Auto)Bert

  • Danke für den heissen Tip.
    Ich komm der Sache schon näher

    Spoiler anzeigen
    [autoit]

    #include <Excel.au3>
    #include <array.au3>

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

    Local $sFilePath1 = @ScriptDir & "\EuF_090423.xls";This file should already exist

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

    Local $oExcel = _ExcelBookOpen($sFilePath1, 0)
    Local $aArray = _ExcelReadArray($oExcel, 4, 1, 4);Direction is Horizontal
    Local $sArrayString = _ArrayToString( $aArray,",", 0, 4 )

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

    Dim $arGrid[2][4] = [["Paul", "Jim", "Richard", "Louis"], [$sArrayString]]
    _ArrayDisplay($arGrid, "_ArrayDisplay() 2D Test", 1, 1) ; [2D, transposed]

    [/autoit]

    Aber leider funktioniert es noch nicht ganz.

    Momentan wird der teil [["Paul", "Jim", "Richard", "Louis"] richtig dargestellt
    Aber wird nicht richtig dargestellt.

  • zum Verständniss:

    mir ist nicht ganz klar wie man Daten aus einer datei über´gibt das es dann quais so aussieht:

    ["Paul", "Jim", "Richard", "Louis"]

    wenn ich jetzt ein 2d Array hätte das so aussieht würde ich es verstehen:

    ["Paul", "Jim", "Richard", "Louis"]
    ["1", "2", "3", "4"]

    aber meins sieht ja nun mal so aus

    Dim $arGrid[2][4] = [["Paul", "Jim", "Richard", "Louis"], [$sArrayString]]

    und der Punkt da [$sArrayString]] denn hab ich nicht begriffen.

    Das sieht dann so aus:

    [Blockierte Grafik: http://www.trattoria-teggiano.de/bild/bild.JPG]

    Da ist sicher was falsch ... aber was ?(

    Gruß Jan

    Einmal editiert, zuletzt von JanausSm (27. April 2009 um 16:04)

  • Hallo JanausSm,

    ich dachte eigentich, das du dir deine Arrays anzeigen lässt (eins nach dem anderen) und zum vergleichen kopierst. Danach kannst du schauen ob die Arrays die gleiche Anzahl von Einträgen haben, wenn ja beim weiteren Testen kannst du gut vergleichen welcher Eintrag Probleme macht.

    mfg (Auto)Bert

    • Offizieller Beitrag

    Mir sind nicht so richtig die Abhängigkeiten zwischen den beiden Quellen klar. Du sprichst von SQL-Wert? ich sehe aber in deinem Code keine Datenbankanbindung.
    Vielleicht kannst du das noch etwas klarer formulieren.

    Aber ich vermute mal, der Fehler ist: _ArrayToString. Damit fügst du die verschiedenen Elemente einfach zusammen.


    Edit:
    Kann es sein, dass du so etwas meinst:

    [autoit]

    #include <array.au3>

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

    Local $array1[4] = ['a','b','c','d']
    Local $array2[4] = ['a1;a2;a3','b1;b2;b3','b1;b2;b3;b4;b5','b1;b2;b3']

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

    Local $array_1_2[4][2]

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

    For $i = 0 To UBound($array1) -1
    Local $aTmp = StringSplit($array2[$i], ';')
    If UBound($aTmp) > UBound($array_1_2, 2) Then ReDim $array_1_2[UBound($array_1_2)][UBound($aTmp)]
    $array_1_2[$i][0] = $array1[$i]
    For $j = 1 To UBound($aTmp) -1
    $array_1_2[$i][$j] = $aTmp[$j]
    Next
    Next

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

    _ArrayDisplay($array_1_2)

    [/autoit]
  • Hallo BugFix,

    genau das begreiff ich grad nicht...

    ich habe doch zwei Quellen mit Daten.

    Einmal eine Quelle mit fest vorgegebenen Daten. Also die hier

    Dim $arGrid[2][4] = [["Paul", "Jim", "Richard", "Louis"], [$sArrayString]]

    und dann habe ich Daten aus einer Exceltabelle die ich mit der Funktion _ExcelReadArray($oExcel, 4, 1, 4) auslesen muss
    und über $sArrayString = _ArrayToString( $aArray,",", 0, 4 ) in $sArrayString stehen hab wenn ich das richtig verstanden habe.
    In $sArrayString stehen dann auch 4 Werte die durch ein Komma von einander getrennt sind.

    Das wäre dann der teil

    Dim $arGrid[2][4] = [["Paul", "Jim", "Richard", "Louis"], [$sArrayString]]

    Blos dieser Teil wird wohl als ein Wert interprtiert...

    Wie schafe ich es nun das dort die vier Werte auch aufgeteilt werden wie bei ["Paul", "Jim", "Richard", "Louis"],

    Gruß Jan

    • Offizieller Beitrag

    Ich kapier nicht, warum du ein bereits existierendes Array in einen String wandelst. Das macht doch keinen Sinn. Dann muß man diesen String erst wieder mit StringSplit in ein Array wandeln um die Daten verwenden zu können.
    Schau dir mein Bsp. an, dort ist genau diese Situation nachgestellt.

  • Naja ich begreif das nett...

    also genau den Teil be deinem Bsp:

    Local $array1[4] = ['a','b','c','d']
    Local $array2[4] = ['a1;a2;a3','b1;b2;b3','b1;b2;b3;b4;b5','b1;b2;b3']

    über die brück komm ich grad net...

    das ist doch in meine Fall anders oder nicht???
    der zweite teil steht doch nicht so da


    Local $array2[4] = ['a1;a2;a3','b1;b2;b3','b1;b2;b3;b4;b5','b1;b2;b3']

    sonder das steht doch in einer $variable... ?(?(?(?(

    und das versteh ich nicht wie kommt es dann dazu das diese r string verwendet wird...

    Nochmal als Erklärung wie der Fall gelagert ist:

    Einmal habe ich Werte die fest stehen und somit auch so wie man es in vielen Fallbeispielen hier beschrieben bekommt so aussieht:

    [autoit]

    Local $array1[4] = ['a','b','c','d']

    [/autoit]


    Ok versteh ich ich habe vier Wert. a,b,c,d

    Dann lese ich aber noch eine Exceltabelle aus mit:

    [autoit]

    Local $sFilePath1 = @ScriptDir & "\EuF_090423.xls";This file should already exist

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

    Local $oExcel = _ExcelBookOpen($sFilePath1, 0)
    Local $aArray = _ExcelReadArray($oExcel, 4, 1, 4);Direction is Horizontal
    Local $sArrayString = _ArrayToString( $aArray,",", 0, 4 )

    [/autoit]

    Und in dieser Variable steht dann zB: "1,2,3,4"

    Jetzt hab ich eine Variable $sArrayString in der meine Werte stehen getrennt durch ein Komma.
    So und wie schffe ich es nun diese Werte so zu wandeln das es am ende in etwa so aussieht:

    [autoit]

    Local $array1[2][4] = [['a','b','c','d'],["1","2","3","4"]]

    [/autoit]

    Ich hoffe Du kannst es mir begreiflich machen weil ich bin mir sicher in Deinem Beispiel ist schon viel erklärt aber ich verstehe wohl noch nicht.

    Gruß Jan

    • Offizieller Beitrag

    Erstelle von Anfang an ein 2D-Array und wenn ein neues Array mit Werten dazukommt, dann vergrößerst Du das Array mit ReDim:

    [autoit]


    #include <Array.au3>
    Global $array1[1][4] = [['a','b','c','d']]
    Global $array2[4] = [1, 2, 4, 5]

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

    ReDim $array1[UBound($array1)+1][4]
    For $i = 0 To 3
    $array1[UBound($array1)-1][$i] = $array2[$i]
    Next
    _ArrayDisplay($array1)

    [/autoit]
    • Offizieller Beitrag

    OK, dann mal ganz von vorn.
    Hier deine Exceltabelle:

    Code
    .	A	B	C	D
    1	w	x	y	z
    2	a	b	c	d
    3	r	s	t	u
    4	f	g	h	i


    Diese liest du jetzt in einer Schleife Zeile für Zeile in ein Array!! (keinen String) ein.
    Aus dem ausgelesenen Array und dem bestehenden bildest du einfach ein neues.

    [autoit]

    #include <array.au3>
    #Include <Excel.au3>

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

    Local $sFilePath1 = @ScriptDir & "\Mappe1.xls"
    Local $array1[4] = ['a','b','c','d']
    Local $oExcel = _ExcelBookOpen($sFilePath1, 0, 1)
    Local $aExcel
    Local $array2[4][5]

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

    For $i = 0 To UBound($array1) -1
    $aExcel = _ExcelReadArray($oExcel, $i+1, 1, 4)
    $array2[$i][0] = $array1[$i]
    For $j = 0 To UBound($aExcel) -1
    $array2[$i][$j+1] = $aExcel[$j]
    Next
    Next
    _ExcelBookClose($oExcel)
    _ArrayDisplay($array2)
    Exit

    [/autoit]
  • Danke Bugfix für die Hilfe aber das muss ich erstmal setzten lassen. :)
    Es funktioniert jetzt so wie ich es mir vorstelle.
    Ich muss das erstmal versuchen langsam zu begreifen.
    Ich habs nehmlich immer noch nicht gerafft :whistling:

    zB das hier:

    [autoit]

    Local $array2[4][5]

    [/autoit]

    heist das nicht es sind 4 dimensionen mit jeweils 5 Einträgen???

    oder ist das nur ein fiktiver Wert weil wenn ich das richtig interpretiere kommt wohl weiter unten der richtige Wert rein.

    [autoit]

    $array2[$i][0] = $array1[$i]

    [/autoit]

    Stimmt der Gedankengang ???

    Gruß Jan

  • Danke füe Deine Geduld mit mir BugFix. Du hast ja auch ne nette Hifeseite.
    Ich muss mich noch nochmal reinknien. Da ich grade feststelle das es ja doch noch nicht
    so läuft wie ich das dachte.

    Momentan ist es so das zB "a" aus dem Array1 einen komplette Zeile aus der Exceltabelle bekommt.
    Das wollt ich anders machen.

    dh

    wenn ich also in der Exceltabelle stehen habe:

    Code
    .	A	B	C	D
    1	1a	2a	3a	4a
    2	1b	2b	3b	4b
    3	1c	2c	3c	4c
    4	1d	2d	3d	4d


    und mein zweites Array sieht so aus:

    [autoit]

    $Array[4]=["WERT1", "WERT2","WERT3","WERT4"]

    [/autoit]

    dann wollte ich erreichen das folgendes passiert:

    1a zu WERT1
    2a zu WERT2
    3a zu WERT3
    4a zu WERT4

    und dann wieder von vorne...

    1b zu WERT1
    2b zu WERT2
    3b zu WERT3
    4b zu WERT4

    Sorry wenn ich mich vieleicht vorher nicht richtig ausgedruckt haben sollte.
    Aber das war nicht meine Absicht Dich zu verwirren ;(

    Gruß Jan