Sprungweite von Tabs definieren oder: Tab-getrennte Text-Tabellen mit identisch langen Zellen

  • Hallo zusammen.

    ich arbeite hobbymäßig an einem Programm mit dem ich im Geschäft automatisch Angebote erstellen möchte.
    Hierfür lese ich eine große Txt.-Datei ein und splitte diese auf.

    Hier ein Auszug der für die folgende Problemaitk wichtigen Stelle des Codes:

    [autoit]


    For $z = 0 To UBound($aEingabe)-1
    $aString=StringSplit($aDaten[_ArraySearch($aArtNr2,$aEingabe[$z][0],0,"",0,1)],@TAB,2)
    ;~ _ArrayDisplay($aString)
    $aEingabe[$z][2]=StringReplace($aString[1],'"',"");- Bezeichnung
    $aEingabe[$z][3]=StringReplace(StringFormat("%.2f",StringReplace(StringReplace($aString[13],',',"."),'"',"")),'.',",");- EVK
    $aEingabe[$z][4]=StringReplace(StringFormat("%.2f",StringReplace(StringReplace($aString[14],',',"."),'"',"")),'.',",");- HEK
    $aEingabe[$z][5] =StringReplace(StringFormat("%.2f",StringReplace(StringReplace($aString[15],',',"."),'"',"")),'.',",") ;- HEK-Staffel
    $aEingabe[$z][6]=int(StringReplace($aString[16],'"',""));- Staffelmenge
    $aEingabe[$z][7]=int(StringReplace($aString[22],'"',""));- Lagermenge
    Next
    Return $aEingabe
    EndFunc

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

    $aPositionen=_Eingabe()

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

    for $i=0 to UBound($aPositionen)-1
    Select
    Case $aPositionen[$i][1] < $aPositionen[$i][6] And $aPositionen[$i][1] <= $aPositionen[$i][7]
    $PosPreis=$aPositionen[$i][4] &" €"
    $Lieferbar="ab Lager"
    Case $aPositionen[$i][1] < $aPositionen[$i][6] And $aPositionen[$i][1] > $aPositionen[$i][7]
    $PosPreis=$aPositionen[$i][4] &" €"
    $Lieferbar=$aPositionen[$i][7] & " Stück ab Lager"
    Case $aPositionen[$i][1] >= $aPositionen[$i][6] And $aPositionen[$i][1] <= $aPositionen[$i][7]
    If $aPositionen[$i][6] = "" Or $aPositionen[$i][6] = 0 Then
    $PosPreis=$aPositionen[$i][4] &" €"
    Else
    $PosPreis=$aPositionen[$i][5] &" €"
    EndIf
    $Lieferbar="ab Lager"
    Case $aPositionen[$i][1] >= $aPositionen[$i][6] And $aPositionen[$i][1] > $aPositionen[$i][7]
    If $aPositionen[$i][6] = "" Or $aPositionen[$i][6] = 0 Then
    $PosPreis=$aPositionen[$i][4] &" €"
    Else
    $PosPreis=$aPositionen[$i][5] &" €"
    EndIf
    $Lieferbar=$aPositionen[$i][7] & " Stück ab Lager"
    EndSelect
    $Position= $Position & $aPositionen[$i][0] &@TAB& $aPositionen[$i][1] &@TAB& $aPositionen[$i][2] &@TAB& $PosPreis &@TAB& $Lieferbar &@CRLF
    MsgBox(0,"",$Position)
    Next

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

    ;- Gültigkeitsdatum berechnen <- 30 Tage +x zum Ende des Monats
    $aValid= StringSplit(_DateAdd('d',30,_NowCalcDate()),"/",2)
    $aValid[2]= _DateDaysInMonth($aValid[0],$aValid[1])

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

    Dim $Angebotstext[1]
    $Angebotstext[0]=$aIni[1][1] & $aIni[3][1] & $Position &@CRLF&@CRLF& $aIni[4][1] & $aIni[5][1]
    $Angebotstext[0]= StringReplace($Angebotstext[0],"{Gültig}",$aValid[2]&"."&$aValid[1]&"."&$aValid[0])
    $Angebotstext[0]= StringReplace($Angebotstext[0],"{Enter}",@CRLF)
    $Angebotstext[0]= StringReplace($Angebotstext[0],"{Tab}",@TAB)
    ;~ _ArrayDisplay($Angebotstext)
    _ArrayToClip($Angebotstext)
    MsgBox(0,"Das Angebot wurde in die Zischenablage kopiert","Klicken Sie in das Textfeld in welches das Angebot eingefügt werden soll und drücken Sie anschließend ""STRG+V"".")

    [/autoit]

    Leider unterscheidet sich die Länge der Eartikelbezeichnungen extrem, so dass diese nicht sauber untereinander stehen.
    Beispiel:


    Art.Nr. Menge Beschreibung Stückpreis Lieferzeit
    ##### 1 Druckerkabel vergossen 2m 3,99 € ab Lager
    ##### 10 Druckerkabel vergossen 2m 3,99 € ab Lager
    ##### 1 VGA-Anschlusskabel , DDC-fähig, 15 pol. HD Stecker/Stecker 1m 1,49 € ab Lager
    ##### 10 VGA-Anschlusskabel , DDC-fähig, 15 pol. HD Stecker/Stecker 1m 1,49 € ab Lager

    Wie schaffe ich es, ohne Excel oder ähnliches, die Laufweite der Tabs genau zu definieren?
    Ich habe folgendes als Ansatz versucht:

    [autoit]

    dim $aSpace[UBound($aPositionen)][3]
    for $i=0 to UBound($aPositionen)-1
    $aSpace[$i][0]= stringlen($aPositionen[$i][2])
    ;~ $aSpace[$i][1]= $i
    Next
    ;~ _ArrayDisplay($aSpace)
    ;~ _ArraySort($aSpace)
    for $i=0 to UBound($aSpace)-1
    $aSpace[$i][1]=$FixLen-$aSpace[$i][0]
    Next
    ;~ _ArraySort($aSpace,"","","",1)
    for $i=0 to UBound($aSpace)-1
    Select
    Case StringLen($aPositionen[$i][2])>=$FixLen
    $Position= $Position & $aEingabe[$i][0] &@TAB& $aEingabe[$i][1] &@TAB& StringLeft($aEingabe[$i][2],50) &@TAB& $aEingabe[$i][3] &@CRLF &@TAB&@TAB& StringMid($aPositionen[$i][2],$FixLen+1) &@CRLF
    Case Else
    $aEingabe[$i][2]=$aEingabe[$i][2] & _StringRepeat(" ",$aSpace[$i][1]+1)
    $Position= $Position & $aEingabe[$i][0] &@TAB& $aEingabe[$i][1] &@TAB& $aEingabe[$i][2] &@TAB& $aEingabe[$i][3] &@CRLF
    EndSelect
    Next
    Dim $aAngebot[1]
    $aAngebot[0]= $Position
    _ArrayToClip($aAngebot)

    [/autoit]

    Also Leerzeichen einfügen.
    Alternativ habe ich versucht herauszufinden wieviele Leerzeichen einem Tab entsprechen.
    Letzteres funktioniert gut im Editor, aber in Programmen die mit anderen Fonts arbeiten (unterschiedlich breite Buchstaben etc.) funktioniert das logischerweise nicht sauber.
    Hat da jemand eine Idee für mich?

    • Offizieller Beitrag

    Das kannst du für Textdateien vergessen. Sowie du einen anderen Font verwendest, sind deine Voreinstellungen dahin.
    Du kannst zwar für alle Fonts ausmessen, welcher Platz dafür belegt wird und entsprechend einrücken - aber wenn du die Datei dann aus der Hand gibst und sie mit anderem Font geöffnet wird paßt das nicht mehr.

  • Hi,

    warum versuchst Du es nicht einmal mit StringFormat () ...

    Dazu ermittelst Du den längsten Text der E-Artikelbezeichnung per StringLen () und setzt den höchsten ermittelten Wert in das "[width]"-Feld des Strings.


    Beispiel
    [autoit]


    Global $aText[3][5] = [["32332-1004", "12", "Massagestab (ohne Ex-Schutz)", "0,99", "ab Lager"], _
    ["32332-1005", "7", "VGA-Anschlusskabel , DDC-fähig, 15 pol. HD Stecker/Stecker 1m", "3,99", "ab Lager"], _
    ["32332-1006", "40", "Druckerkabel vergossen 2m", "0,99", "ca. 7 Tage"]]

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

    Global $nMaxLen = 0
    Global $nLen = 0

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

    For $i = 0 To UBound ($aText) - 1

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

    ; Angenommen $aText[$i][2] enthält die E-Artikelbeschreibung ...
    $nLen = StringLen ($aText[$i][2])

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

    If ($nLen > $nMaxLen) Then _
    $nMaxLen = $nLen
    Next

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

    ; ...

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

    Global $sFormat = StringFormat ("%%-12s %%-6s %%-%ds %%10s € %%s\n", $nMaxLen)
    ;~ ConsoleWrite ($sFormat)
    Global $sTabellenkopf = StringFormat ($sFormat, "Art.Nr.", "Menge", "Beschreibung", "Stückpreis", "Lieferzeit")
    ConsoleWrite ($sTabellenkopf)

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

    For $i = 0 To UBound ($aText) - 1

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

    ConsoleWrite (StringFormat ($sFormat, $aText[$i][0], $aText[$i][1], $aText[$i][2], $aText[$i][3], $aText[$i][4]))
    Next

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

    Exit (0)

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

    ;------

    [/autoit]


    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (13. Februar 2011 um 18:26)

  • Danke euch, das hilft mir schon weiter.
    Ich werde es wohl über den Umweg Excel realisieren.
    Alle Werte dort eintragen und dann von da aus in die Zwischenablage.
    Dann kann ich es nämlich als RTF einfügen und es sieht gut aus :)