Textdatei...Verändern? :D

  • Hallo, nehmen wir an ich habe eine test.txt mit folgendem Inhalt:

    Username1^Basis1^Item1$1^Test^Test
    Username1^Basis1^Item2$1^Test^Test
    Username1^Basis1^Item3$1^Test^Test
    Username2^Basis1^Item1$1^Test^Test
    Username3^Basis1^Item5$1^Test^Test
    Username3^Basis1^Item6$1^Test^Test
    Username3^Basis1^Item7$1^Test^Test
    Username4^Basis1^Item3$1^Test^Test
    Username4^Basis1^Item2$1^Test^Test

    Also das ganze ist so aufgebaut: Benutzername der Person ^ Die Basis der Person ^ Name des Items $ Anzahl der Items ^Test^Test

    Nunja, nun möchte ich, dass wenn ein user öfter in der liste auftaucht, wie folgend:


    Username1^Basis1^Item1$1^Test^Test
    Username1^Basis1^Item2$1^Test^Test
    Username1^Basis1^Item3$1^Test^Test

    dass das zu einer Zeile geändert wird:

    Username1^Basis1^Item1$1#Item2$1#Item3$1^Test^Test


    D.h. dass Einzelne Items von der Selben person nur in einer Zeile sind, und die genauen items und Anzahl mit einem # getrennt werden.

    Habe da keine idee :/

    2 Mal editiert, zuletzt von Alisamix (11. Februar 2011 um 12:14)

  • Hallo Alisamix,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die deutsche Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu deinem Problem:

    • mit [autoit]_FileReadToArray[/autoit] die ganze Datei in ein Array einlesen
    • ein 2D. Array mit 1. Dimension gleich Anzahl der Element des Ursprungsarrays 2. Dimension mind. 2
    • in einer For ... Next Schleife das Ursprungsarray durchgehen, in der Schleife mit [autoit]StringSplit[/autoit] jede Ursprungszeile spliten (Trennzeichen=^). Die (gewünschten) SplitResults in das 2. Array eintragen
    • das 2D Array mit [autoit]_ArraySort[/autoit] sortieren.
    • in ein weiteres Array mit [autoit]_ArrayUnique[/autoit] die User ausgeben lassen.
    • in einer [autoit]For .. Next[/autoit] - Schleife das UserArray durchehen und darin für jeden User mit [autoit]_ArrayFindAll[/autoit] alle Elemente für den jeweiligen User suchen diese mit Stringfunktionen zusammenstringen und in die Textdatei schreiben

    mfg autoBert

  • Hallo, erstmal danke für deine Antwort. Ich setze mich schon lange mit Autoit auseinander, mein jetziges Script sieht z.B. so aus:

    [autoit]

    #include <Array.au3>
    #include <File.au3>

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

    $file = FileOpen("final.txt", 1)

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

    Dim $filedata
    Dim $zeile
    _FileReadToArray ("test.txt",$filedata)
    sleep(10)

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

    For $i = 2 To $filedata[0]

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

    $filedata[$i] = StringSplit($filedata[$i], "///", 3)
    $tmp = $filedata[$i]

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

    $final = $tmp[0] & "^" & $tmp[1] & "^"& $tmp[2] & "$" & $tmp[3] & "^^Test^Test" & @CRLF

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

    FileWrite( $file, $final )

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

    Next

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

    Exit

    [/autoit]

    Das Funktioniert. So mache ich aus:

    Username1///Basis1///Item1///Anzahl1

    Username1^Basis1^Item1$1^Test^Test


    Aber das was du erklärt hast ist nicht ganz so einfach für 1,8k user hehe..^^

  • Du hast vergessen die test.txt einzustellen, denn warum erst eine Zwischendatei (final.txt) erzeugen, wenn man es in einem Aufwasch erledigen kann.

    Wenn du willst das man dir hilft solltest du diese einstellen,

    mfg autoBert

  • Nunja, ich habs nicht in einer datei damit ich die quelldatei immer gleich hab, das wird alles noch.

    asfg///12///Karl Testobjekt///1
    5as///Kuchen///Teststiefel///1
    Baumkrone1235///Mybase///QWER II///1
    Baumkrone1235///Mybase///fw190///2
    Baumkrone1235///Mybase///Fregatte-A Testobjekt///3
    Baumkrone1235///Mybase///Howard Testobjekt///2
    Baumkrone1235///Mybase///Lanmaler///3
    Baumkrone1235///Mybase///Kidd Testobjekt///1
    Baumkrone1235///Mybase///Lanmaler///1
    Baumkrone1235///Mybase///QWER II///2
    Baumkrone1235///Mybase///Testobjekt///1
    Baumkrone1235///Mybase///Kursk Testobjekt///1
    Baumkrone1235///Mybase///Hochexplosive Seemine///1
    Baumkrone1235///Mybase///Auftragsbombe///1
    Baumkrone1235///Mybase///Auftragsbombe///5
    Baumkrone1235///Mybase///Auftragsbombe///11
    Baumkrone1235///Mybase///Auftragsbombe///4


    Hier ein Auszug.

  • Hallo Alisamix,

    da ich meinem NetBook keine hochexplosiven Sachen (Seeminen, Auftragsbomben) antue, hier eine Lösung für den Text wie in Post #1:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

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

    Dim $aSource
    _FileReadToArray("final.txt", $aSource)
    Dim $aSplitted[$aSource[0]][3]

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

    For $i = 1 To $aSource[0]
    $aItem = StringSplit($aSource[$i], "^")
    ; _ArrayDisplay($aItem,"Item splitted")
    $aSplitted[$i - 1][0] = $aItem[1] & "^" & $aItem[2]
    $aSplitted[$i - 1][1] = $aItem[3]
    $aSplitted[$i - 1][2] = $aItem[4] & "^" & $aItem[5]
    Next
    ;_ArrayDisplay($aSplitted, "Splittet not Unique")

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

    $aNew = _ArrayUnique($aSplitted)
    _ArrayDelete($aNew, 0)
    ;_ArrayDisplay($aNew, "New before stringed")
    For $i = 0 To UBound($aNew) - 1
    $aFound = _ArrayFindAll($aSplitted, $aNew[$i])
    ;_ArrayDisplay($aFound)
    $sItems = ""
    $iLast = UBound($aFound) - 1
    For $j = 0 To $iLast
    $sItems &= $aSplitted[$aFound[$j]][1]
    if $j <> $iLast Then $sItems &= "#"
    Next
    $aNew[$i] = $aNew[$i] & "^" & $sItems & "^" & $aSplitted[$i][2]
    Next
    _ArrayDisplay($aNew, "New String")
    _FileWriteFromArray(@ScriptDir & "\NEW.txt",$aNew)

    [/autoit]

    mfg autoBert

  • Danke, funktioniert perfekt, muss mich noch einlesen.

    Baumkrone1235///Mybase///Auftragsbombe///1
    Baumkrone1235///Mybase///Auftragsbombe///5
    Baumkrone1235///Mybase///Auftragsbombe///11
    Baumkrone1235///Mybase///Auftragsbombe///4

    Es funktioniert so schonmal. Baumkrone^Mybase^Auftragsbombe$1#Auftragsbombe$5 etc

    Ein Problem gibt es: Wenn identische Itemnamen vorkommen, sollten alle zu einem zusammengefasst werden und einfach nur die Anzahl addiert werden, wenn mir das noch jemand erklären könnte wäre das super. :)

    Also z.B. Auftragsbombe$2#Auftragsbombe$3 sollten einfach nur Auftragsbombe$5 werden.

    3 Mal editiert, zuletzt von Alisamix (11. Februar 2011 um 12:28)

  • Hallo Alisamix,

    da mein Skript für diese Datei:

    Code
    Username1^Basis1^Item1$1^Test^Test
    Username1^Basis1^Item2$1^Test^Test
    Username2^Basis1^Item3$1^Test^Test

    gemacht ist in der Datei aber nirgends eine Anzahl zu erkennen ist solltest du eine vernünftige Datei in diesem Format einstellen am besten noch 1 Überschriftszeile davor hängen, damit auch ich mir etwas darunter vorstellen kann,

    mfg autoBert

  • Sorry, hab das ja nirgends erwähnt.

    Das Dollarzeichen und die Zahl ist die Anzahl.


    Also Testitem$1 ist 1 Testitem, während Baum$5 5 Bäume sind.

    Also hier:
    Baumkrone1235///Mybase///Auftragsbombe///5

    Wäre 5 die Anzahl.