Adress Daten in Array einlesen und formatieren

  • Hallo zusammen

    ich stehe vor folgender Herausforderung:

    Ich habe eine Adressdatei die folgendes Format hat:


    1;"müller";"Michael Müller";"Hauptstrasse 49";"80000";"München";
    2;"meier";"Thomas Meier";"Rheinweg 5";"60057";"Frankfurt";
    3;"schmidt";"Sabine Schmidt;"Fortranstrass 28";"10000";"Berlin";


    Nun habe ich mit der Funtion _FileReadtoArray die Daten in ein Array importiert und mit _ArrayDisplay anzeigen lassen.

    Mit welchem Befehl kann ich nun die Daten so formatieren das für jeweils eine Spalte für jeden Wert (Kd-Nr.,suchname,Vorname Name,Strasse,PlZ,Ort im Array Display angezeigt wird?

    Row Col0 (Kd-Nr) Col1 (suchname) Col2 (Vorname u. Name) usw.

    0 3

    1 1 müller Michael Müller

    2 2 meier Thomas Meier

    3 3 schmidt Sabine Schmidt


    Wenn ich momentan die Funktion _FileReadtoArray verwende wird es mit _ArrayDisplay folgendermassen angezeigt:

    [0]|3
    [1]|1;"müller";"Michael Müller";"Hauptstrasse 49";"80000";"München";
    [2]|2;"meier";"Thomas Meier";"Rheinweg 5";"60057";"Frankfurt";
    [3]|3;"schmidt";"Sabine Schmidt;"Fortranstrass 28";"10000";"Berlin";


    Ich hätte gerne für jeden Wert (Nr. suchname, Vorname Nam, Strasse usw) eine eigene Spalte. Ist das möglich?


    #include <array.au3>
    #include <file.au3>

    Dim $path_adressen = "C:\AutoIt\Adressen.txt"
    Dim $arr_adressen

    If not _FileReadToArray($path_adressen,$arr_adressen) Then
    MsgBox(0,"","Error opening specified file")
    EndIf
    _ArrayDisplay($arr_adressen,"Titel von Arraydisplay")

  • Hi,

    schau Dir mal die Funktion Stringsplit an:

    [autoit]


    For $i = 1 To Ubound ($arr_adressen) - 1
    $arkunde = Stringsplit ($arr_adressen [$i], ";", 2)
    _ArrayDisplay ($arrkunde)
    Next

    [/autoit]

    ;-))
    Stefan

  • Mit Stringbetween denk ich gehts am besten

    hier mal n script ohne Errorhandling. Müsste aber funktionieren

    Spoiler anzeigen
    [autoit]

    #include <String.au3>
    #include <array.au3>
    #include <file.au3>

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

    Dim $path_adressen = FileOpenDialog("Datei wählen", @DesktopDir, "Alle Dateien (*.*)")
    Dim $arr_adressen
    Dim $ergeb[1][1]

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

    _FileReadToArray($path_adressen,$arr_adressen)
    For $i = 1 To $arr_adressen[0]
    $between = _StringBetween($arr_adressen[$i], ';"', '";')
    ReDim $ergeb[$i + 1][Ubound($between)]
    $ergeb[0][0] = Ubound($ergeb) - 1
    For $k = 0 To (Ubound($between) - 1)
    $ergeb[$i][$k] = $between[$k]
    Next
    Next

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

    _ArrayDisplay($ergeb)

    [/autoit]
  • Antwort (wie immer) viel zu langsam, aberScript läuft^^

    Spoiler anzeigen
    [autoit]

    #include <File.au3>
    #include <Array.au3>
    dim $filearray
    _FileReadToArray("adress.dat",$filearray) ;adressen einlesen
    _arraydisplay($filearray)
    Stringreplace($filearray[1],";",";") ;anzahl der spalten herausfinden
    dim $adressen[$filearray[0]][@extended+1] ;array dimensionieren (Tabelle)
    for $zeile=1 to ubound($filearray)-1 ;jede adresszeile
    $aspalte=stringsplit($filearray[$zeile],";",3) ;aufteilen in spalten
    for $spalte=0 to ubound($aspalte)-1 ;jede spalte in das array eintragen
    $adressen[$zeile-1][$spalte]=stringreplace($aspalte[$spalte],'"',"") ;hochkommas löschen
    next
    next
    _arraydisplay($adressen)

    [/autoit]
  • Auch viel zu spät ...
    Hatte da auch noch was herumliegen:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    Main()

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

    Func Main()
    Local $sAdr = "C:\\Adressen.txt"
    Local $h = FileOpen($sAdr, 128) ; 128 = unicode
    Local $aRet = _CSV2Array($h)
    FileClose($h)
    _ArrayDisplay($aRet)

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

    EndFunc ;==>Main

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

    ; #FUNCTION# ===================================================================
    ; Name ..........: _CSV2Array
    ; Description ...:
    ; AutoIt Version : V3.3.0.0
    ; Syntax ........: _CSV2Array($hFile[, $cSeperator = "auto"[, $bFilterString = True]])
    ; Parameter(s): .: $hFile - Handle for the CSV file to Read
    ; $cSeperator - Optional: (Default = "auto") : Tries to find the separator char ;) or , or TAB or | or space)
    ; | Data-seperator-char
    ; | Empty-string = Opt("GUIDataSeparatorChar")
    ; $bFilterString - Optional: (Default = True) : Removes leading and trailing " or '
    ; Return Value ..: Success - 2-dim Array
    ; Failure - 0
    ; @ERROR - 1: error file read
    ; Author(s) .....: Thorsten Willert
    ; Date ..........: Wed Dec 17 18:35:55 CET 2008
    ; ==============================================================================
    Func _CSV2Array($hFile, $cSeperator = "auto", $bFilterString = True)
    Local $s = FileRead($hFile)
    If @error Then Return SetError(1)

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

    If Not $cSeperator Then $cSeperator = Opt("GUIDataSeparatorChar")

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

    Local $aLines
    If StringInStr($s, @LF) Then
    $aLines = StringSplit($s, @LF)
    ElseIf StringInStr($s, @CR) Then
    $aLines = StringSplit($s, @CR)
    Else
    $aLines = StringSplit($s, @CRLF)
    EndIf

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

    Local $iMax = 0
    Local $aTMP
    If $cSeperator = "auto" Then
    Local $iC[5] = [0, 0, 0, 0, 0]
    Local $sC[5] = [";", ",", @TAB, "|", " "]
    $aTMP = StringRegExp($aLines[1], ";", 3)
    If Not @error Then $iC[0] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], ",", 3)
    If Not @error Then $iC[1] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], "\t", 3)
    If Not @error Then $iC[2] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], "\|", 3)
    If Not @error Then $iC[3] = UBound($aTMP)
    $aTMP = StringRegExp($aLines[1], "[ ]", 3)
    If Not @error Then $iC[4] = UBound($aTMP)
    For $i = 0 To UBound($sC) - 1
    If $iC[$i] > $iMax Then
    $iMax = $iC[$i]
    $cSeperator = $sC[$i]
    EndIf
    Next
    EndIf

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

    $aTMP = StringSplit($aLines[1], $cSeperator)
    Local $iCol = $aTMP[0]

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

    Local $aRet[$aLines[0]-1][$iCol]
    For $i = 1 To $aLines[0] - 1
    $aTMP = StringSplit($aLines[$i], $cSeperator)
    For $j = 1 To $aTMP[0]
    If $bFilterString Then
    $aTMP[$j] = StringStripWS($aTMP[$j], 3)
    $aTMP[$j] = StringRegExpReplace($aTMP[$j], '^("|'')(.*?)\1$', '$2')
    EndIf
    $aRet[$i - 1][$j-1] = $aTMP[$j]
    Next
    Next

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

    Return $aRet
    EndFunc ;==>_CSV2Array

    [/autoit]
  • Hallo Andy

    ich habe Dein Script auch getestet. Vielen Dank für die detailierte Erklärungen der einzelnen Programmzeilen.

    Es funktioniert perfekt. Ich werde deine Variante benutzen und hoffe die anderen sind mir nicht böse.


    Vielen Dank an alle die so zahlreich Unterstützung gegeben haben.

  • Zitat

    Vielen Dank für die detailierte Erklärungen der einzelnen Programmzeilen.

    Nicht dafür... :D
    Anhand der Kommentare kann man Scripte idR wie "ein Buch" lesen. Fehlerfinden leichter gemacht inclusive!