esten Buchstaben

  • Moin Moin zusammen.

    Ich habe eine CSV Datei mit einigen Spalten und vielen Zeilen. Ich möchte das vor bzw. nach einem [;] das Feld auf die ersten sieben Stellen (Buchstaben, Zahlen, ...) gekürzt wird. Beachten muss man evtl. Leerstellen auch am Anfang beachten bzw. besser wäre das die zuvor entfernt werden.

    Vorher:
    1432949506; Musterwochentag;Sonntagabend;Butterbrot ; Sahnekuchen

    Nachher:
    1432949; Muster;Sonntag;Butterb; Sahnek

    Hat jemand einen Lösungsvorschlag?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • EDIT: Funktion eingefügt

    [autoit]

    Func _ModifyString($sString, $iCount, $sDelimiter, $iFlag)
    If Not IsString($sString) Then Return -1
    If Not IsInt($iCount) Then Return -2
    If Not IsString($sDelimiter) Then Return -3
    If Not IsInt($iFlag) Then Return -4

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

    $WS_String = StringStripWS($sString, $iFlag)
    $aString = StringSplit($WS_String, $sDelimiter)
    $aString = StringSplit($WS_String, $sDelimiter)

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

    For $i = 1 To $aString[0]
    If $i = (UBound($aString) - 1) Then
    $NewString &= StringLeft($aString[$i], $iCount)
    Else
    $NewString &= StringLeft($aString[$i], $iCount) & $sDelimiter & " "
    EndIf
    Next

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

    Return $NewString
    EndFunc

    [/autoit]


    Dann einfach File einlesen und jede Zeile auslesen und mit der Funktion trimmen ;)
    Falls Erklärung besteht, hier gibts ja eine Super Community :)

  • Spoiler anzeigen
    [autoit]


    #include <array.au3>
    #include <File.au3>

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

    Global $aFile

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

    $input = "test.txt"
    $output = "output.txt"

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

    ;Flag zum Kennzeichnen der Art des Entfernens von Leerstellen(für mehrere Arten werden die Flags addiert):
    ;1 = entferne führende Leerstellen
    ;2 = entferne nachfolgende Leerstellen
    ;4 = entferne doppelte (oder mehr) Leerstellen zwischen den Zeichen
    ;8 = entferne alle Leerstellen (überschreibt alle anderen Flags)
    $stripWS = 7

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

    _FileReadToArray($input, $aFile)
    $hOutput = FileOpen($output, 2)
    If IsArray($aFile) Then
    For $i = 1 To $aFile[0]
    $aSplit = StringSplit($aFile[$i], ";")
    If IsArray($aSplit) Then
    For $j = 1 To $aSplit[0]
    $aSplit[$j] = StringLeft(StringStripWS($aSplit[$j],$stripWS), 7)
    Next
    FileWrite($hOutput, _ArrayToString($aSplit, ";", 1) & @CRLF)
    EndIf
    Next
    EndIf
    FileClose($hOutput)

    [/autoit]

    Hoffe das entspricht in etwa den Anforderungen.

    &quot;test.txt&quot;
    Code
    1 43294  9506 ; Musterwochentag ;Sonntag  abend;Butte  rbrot ; Sa  nekuchen
     14329 49506; Musterw  ochentag;Sonn tagabend;Butterbrot ; Sahneku  chen
    1 432949 506; Must   erwochentag;Sonntaga  bend;Bu  tterbrot ; Sahnekuchen
    &quot;output.txt bei $stripWS=8&quot;
    Code
    1432949;Musterw;Sonntag;Butterb;Sanekuc
    1432949;Musterw;Sonntag;Butterb;Sahneku
    1432949;Musterw;Sonntag;Butterb;Sahneku
  • Kann dich da beruhigen. Hatte einen kleinen Fehler drin.
    Beim _ArrayToString() habe ich nicht Index 1 als Startelement gesetzt. In Index 0 steht ja etwas, das man in der Ausgabe nicht haben will. Hab's jetzt mal korigiert.
    Es gibt dafür sicher noch elegantere Möglichkeiten. Das war jetzt nur die erste, spontane Eingebung.

  • Hallo i2c,

    ich würde dein Skript an 2 Stellen abändern:

    • beim Fileopen für das Outputfile
    • beim entfernen der Leerstellen

    Änderungen sind im Skript kommentiert:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    #include <File.au3>

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

    Global $aFile

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

    $input = "test.txt"
    $output = "output.txt"

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

    _FileReadToArray($input, $aFile)
    $hOutput = FileOpen($output, 2); damit eventuell bestehendes File überschrieben wird
    If IsArray($aFile) Then
    For $i = 1 To $aFile[0]
    $aSplit = StringSplit($aFile[$i], ";")
    If IsArray($aSplit) Then
    For $j = 1 To $aSplit[0]
    $aSplit[$j] = StringLeft(StringStripWS($aSplit[$j],1), 7) ;nur führende Leerstellen entfernen
    Next
    FileWrite($hOutput, _ArrayToString($aSplit, ";", 1) & @CRLF)
    EndIf
    Next
    EndIf
    FileClose($hOutput)

    [/autoit]

    Natürlich macht ein Pro direkt alles 1000mal besser :DDas doch fies :D Man steckt Zeit hinein, und einer kommt und überbietet dich um einiges xD

    wenn du Hilfe suchst möchtest du doch auch das bestmöglichste Ergebnis, also gönne es doch auch Alina, damit sie ihre Heimarbeit etwas leichter hat,

    mfg autoBert

  • Hachja, die flags von FileOpen() werd ich hoffentlich auch irgendwann mal in meinen Kopf bekommen. Ist ja nicht das erste mal das ich die durcheinander bringe :rolleyes: .

    Ich hatte es so verstanden, das alle Leerstellen entfernt werden sollen. Wenn ich jetzt nochmal über Alinas Beitrag lese, kommen bei mir allerdings Zweifel auf. Sei's drum. Hab das Beispiel oben mal angepasst, der flag eine Variable zugeordnet und die Beschreibung aus der deutschen Hilfe mit eingesetzt.

    wie immer ... danke autoBert :thumbup:

  • PERFEKTE LÖSUNG !!!!

    WOW WOW WOW

    D A N K E !!!!

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr