csv to excel

  • Hallo,

    ich möchte eine csv auslesen und daraus mir einen Exceldatei "xls" bauen auch mit verschiedenen tabellenblättern,

    mir fehlt der erste einstig wie ich dort parse und eine exel "xls"erzeuge hat jemand eine idee , tipps oder vielleicht sogar ein beispiel


    Würde für jede hilfe sehr dankbar sein.

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • ok ich kann sie in excel importieren dann muss diverse arbeiten gemacht werden

    spalten die bestimmte namen enthalten auf ein anderes tabellenblatt, bestimmte werte zusammen fügen ...... und und


    wo ich immer monatsende meinen chef einen report geben muss ob ich die SLA eingehalten habe,

    dauer mindesten 1 h bis ich fertig bin die zeit kann ich mir sparen und weiter autoit lernen ;)


    eine idee ?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    • Offizieller Beitrag

    Also du willst die csv zerpflücken und in verschiedene Tabellenblätter die Daten einfügen.
    Das kannst du mit der Excel-UDF tun. Schau dir mal die Befehle an - da findest du, was du brauchst.
    Deine Kriterien zum Aufteilen der Daten mußt du dann nur noch in ein Programm pressen. ;)

  • habe echt einen kleinen blackout kannst du mir einen kleinen einstieg geben wäre echt sehr dankbar dafür

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

  • so habe mal vieles unkenntlich gemacht aber muss es so zerpflücken ;)

    es sind immer die gleichen werte und Gruppen und zum Schluss muss bei gesamt gerechnet werden wer wie viel Tickets hat.


    und die Ausgangstabelle ist alle Daten auf einem Tabellenblatt mit , bzw. mit ; getrennt.

    danke

    autoit.de/wcf/attachment/4858/

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    2 Mal editiert, zuletzt von subzero007 (22. Mai 2009 um 07:14)

    • Offizieller Beitrag

    Habe zwischenzeitlich schon mal ein allgemeines Muster erstellt:

    [autoit]

    #Include <Excel.au3>
    #include <File.au3>
    Local $csv = @ScriptDir & '\test_x.txt', $aCSV, $split
    _FileReadToArray($csv, $aCSV)
    $oExcel = _ExcelBookNew()

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

    ; in einzelne Zelle (Z2S2) schreiben (aus Datei Zeile1/ zweites Element ==> Vorname)
    _ExcelWriteCell($oExcel, 'NAME', 1, 1)
    _ExcelWriteCell($oExcel, 'VORNAME', 1, 2)
    $split = StringSplit($aCSV[1], ',', 2)
    _ExcelWriteCell($oExcel, $split[1], 2, 2)

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

    ; Tabellenblatt umbenennen
    _ExcelSheetNameSet($oExcel, "Muster_1")

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

    ; nächstes Tabellenblatt aktivieren - wenn kein weiteres da ==> erstellen
    $aSheets = _ExcelSheetList($oExcel)
    If $aSheets[0] = 1 Then _ExcelSheetAddNew($oExcel, "Muster_2")
    _ExcelSheetActivate($oExcel, 2)
    If _ExcelSheetNameGet($oExcel) <> "Muster_2" Then _ExcelSheetNameSet($oExcel, "Muster_2")

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

    ; Daten auf diesem Sheet eintragen
    _ExcelWriteCell($oExcel, 'NAME', 1, 1)
    _ExcelWriteCell($oExcel, 'VORNAME', 1, 2)
    $split = StringSplit($aCSV[3], ',', 2)
    _ExcelWriteCell($oExcel, $split[1], 2, 2)

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

    ; Zellen Formatieren von Sheet 2
    With $oExcel.ActiveWorkbook.Sheets(2)
    .range("A1:B1").Font.Size = 16
    .range("A1:B1").Font.Color = 0xff0000
    .range("A1:B1").Font.Bold = TRUE
    .range("A1:B1").Font.Name = 'Comic Sans MS'
    .range("A1:B1").Interior.Color = 0x8888ff
    Endwith

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

    ; Datei speichern
    ;~ _ExcelBookSave($oExcel)

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

    ; oder Datei speichern unter
    ;_ExcelBookSaveAs($oExcel, 'Speicherpfad')

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

    ; ODER schließen UND speichern
    ;~ _ExcelBookClose($oExcel)

    [/autoit]
  • wie sollte ich denn zeile für zeile lesen was welcher agent gemacht hat?

    und welche gruppe veranwortliche war für das ticket?

    muss es ja zeile für zeile auswerten, hast du mein beispiel gelesen?

    ich muss ja zum schluss sogar auswerten??!!

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    Einmal editiert, zuletzt von subzero007 (21. Mai 2009 um 23:28)

    • Offizieller Beitrag

    Das Problem hier ist sicher nicht die skriptmäßige Umsetzung (das erklärt mein Bsp. bzw. die anderen Funktionen der Excel-UDF), sondern wohl eher die Auswertelogik zu erstellen.
    Ich weiß nicht, woher die Info für die Gruppenzugehörigkeit stammt. Steht das in der csv?
    Wenn alle Daten gemeinsam in einer Datei stehen, mußt du zuerst nach Gruppen sortieren. Anschließend überträgst du jeweils die Daten einer Gruppe auf ein Tabellenblatt. Das Tabellenblatt zur Auswertung enthält dann Formeln, die auf die einzelnen Tabellenblätter verweisen.
    Normale Excel-Formeln halt. Ich häng dir mal noch eine nützliche Funktion zur Bestimmung der belegten Zeilen/Spalten an.

    _ExcelBookGetWidth()
    [autoit]

    ;==================================================================================================
    ; Function: _ExcelBookGetWidth($oExcel [, $iTyp=1 [, $iHeader=1 [, $sCol='A']]])
    ; Description: Gibt die letzte belegte Zeile und/oder Spalte einer Tabelle zurück
    ; Syntax: _ExcelBookGetWidth($oExcel, $iTyp=1, $iHeader=1, $sCol='A')
    ; Parameter(s): $oExcel - Referenz eines geöffneten Excel Objekts
    ; $iTyp - 1=letzte Spalte (Standard); 2=letzte Zeile; 3=Spalte|Zeile
    ; $iHeader - Nummer der Zeile, in der die letzte Spalte gesucht wird
    ; $sCol - Buchstabe der Spalte, in der die letzte Zeile gesucht wird
    ; Return Value(s): Erfolg - letzte Spalte und/oder Zeile
    ; Ist die Zeile oder Spalte leer, wird '0' zurückgegeben
    ; Fehler - 0 und setzt @error:
    ; @error=1 - Objekt existiert nicht
    ; @error=2 - $iTyp oder $iHeader außerhalb des Wertebereichs (1 - 65536)
    ; @error=3 - $sCol außerhalb des Wertebereichs (A - IV)
    ; Requirement(s): $iHeader bzw. $sCol sind durchgängig bis zum letzten Zeilen-/Spaltenelement belegt
    ; Author(s): BugFix ( [email='bugfix@autoit.de'][/email] )
    ;==================================================================================================
    Func _ExcelBookGetWidth($oExcel, $iTyp=1, $iHeader=1, $sCol='A')
    If Not IsObj($oExcel) Then Return SetError(1, 0, 0)
    If $iTyp < 1 Or $iHeader < 1 Or $iTyp > 65536 Or $iHeader > 65536 Then Return SetError(2, 0, 0)
    $sCol = StringUpper($sCol)
    If StringLen($sCol) = 2 Then
    Local $str = StringSplit($sCol, '')
    If Asc($str[1]) < 65 Or Asc($str[1]) > 73 Then Return SetError(3, 0, 0)
    If Asc($str[2]) < 65 Or Asc($str[2]) > 90 Or _
    (Asc($str[1]) = 73 And Asc($str[2]) > 86) Then Return SetError(3, 0, 0)
    ElseIf StringLen($sCol) > 2 Then
    Return SetError(3, 0, 0)
    EndIf
    If Asc($sCol) < 65 Or Asc($sCol) > 90 Then Return SetError(3, 0, 0)
    Local $sColOut, $iRowOut
    Select
    Case $iTyp = 1 Or $iTyp = 3
    For $i = 65 To 90
    If $oExcel.Activesheet.Range(Chr($i) & $iHeader).Value = '' Then
    If $i = 65 Then
    $sColOut = 0
    Else
    $sColOut = Chr($i-1)
    EndIf
    ExitLoop
    EndIf
    If $i = 90 Then
    For $j = 65 To 73
    For $k = 65 To 90
    If $j = 73 And $k = 87 Then
    $sColOut = Chr($j) & Chr($k-1)
    ExitLoop
    EndIf
    If $oExcel.Activesheet.Range(Chr($j) & Chr($k)).Value = '' Then
    If $k = 65 Then
    $sColOut = Chr($j)
    Else
    $sColOut = Chr($j) & Chr($k-1)
    EndIf
    ExitLoop
    EndIf
    Next
    Next
    EndIf
    Next
    ContinueCase
    Case $iTyp = 2
    For $i = 1 To 65536
    If $oExcel.Activesheet.Range($sCol & $i).Value = '' Then
    $iRowOut = $i -1
    ExitLoop
    EndIf
    Next
    EndSelect
    Switch $iTyp
    Case 1
    Return $sColOut
    Case 2
    Return $iRowOut
    Case 3
    Return $sColOut & '|' & $iRowOut
    EndSwitch
    EndFunc ;==>_ExcelBookGetWidth

    [/autoit]
  • danke erstmal für die schnelle antwort war aber gestern auch für mich spät geeworden .

    zu der frage woher die gruppen zugehörigkeit stammt? Aus der csv "hier bisschen abgeändert weil firmendaten".

    kannst du mir oder ein anderer ein tip geben wie ich anfangen soll ?

    Damit ich das ergebniss wie im Excelblatt habe erziehlen kann?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    Einmal editiert, zuletzt von subzero007 (22. Mai 2009 um 07:06)

    • Offizieller Beitrag

    Hi,
    du hast nun das Ergebnis geposted - ich brauch aber mal eine Zeile der Original.csv. Natürlich keine Echtdaten, nur in der Form etwa:

    Zeile_in_CSV=Feld1,Feld2,Feld3,Feld4,Feld5

    Feld1 = GRUPPE
    Feld2 = BLA
    Feld3 = BLUB
    Feld4 = DIES
    Feld5 = DAS

    Und dann, die Zuordnungen
    - je Gruppe ein Tabellenblatt
    - innerhalb Gruppe Anordnung nach Muster/Sortierung....
    - Auswerteblatt mit Einzel/Summen-Darstellung der Gruppen nach Kriterien..

  • hey,
    so hier ein orginal auszug autoit.de/wcf/attachment/4861/
    je gruppe ein tabbelblatt ? aber ich muss ja auch noch nach agent sortieren ?? also team 2 und team1 die will ich ja trennen die machen ja alle aufgaben und können alle gruppen enthalten?
    es müssen zum schluss gezählt werden wer, wieviele ticktes gemacht hat ?
    und es gibt auf werte die ich aus der Short Description filtern muss z.b. wenn dort auftrag steht dann muss es in einen sepeterate gruppe wenn er auch in der admin gruppe ist dann zum tabellenblatt admin team.
    Wenn auftrag steht aber in der it gruppe dann muss es zum tabellenblatt MAC zugeordnet werden.
    wenn submitter auto und admin gruppe dann in admin team
    wenn submitter auto und in it gruppe dan in MAC
    und alle agenten aus team 1 und 2 trennen wenn sie das ticket selbst gelösst haben das ist dann die ticket anzahl vom agenten was er gelösst hat.
    ich hoffe ich konnte dir jetzt mein problem erklären

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    • Offizieller Beitrag

    Na, wenn die Logik steht, brauchst du doch nur in etwa so vorgehen:
    - notwendige Sheets erstellen
    - csv mit _FileReadToArray einlesen
    - anhand deiner Bedingungen das Array Zeile für Zeile abarbeiten
    z.B.
    • 'Auftrag' UND 'Admin' UND 'IT' ? ==> zu Sheet MAC
    • 'Auftrag' UND 'Admin' ? ==> zu Sheet ADMIN
    • nur 'Auftrag' ? ==> zu Sheet separate Gruppe

    Das kannst du über Select-Case oder If-Then-ElseIf -Strukturen gestalten. Das Problem ist wirklich ausschließlich die Logik, wann welcher Eintrag wo zugeordnet wird. Das Schreiben in die Sheets ist dann ein reiner Formalismus.
    Bevor du an die Umsetzung der Kriterien gehst, hilft es vllt., wenn du dir das grafisch per Schnittmengen darstellst und daran die Priorität festlegst. Die Abfrage-Reihenfolge muß dann von der höchsten zur niedrigsten Priorität erfolgen.

  • Und wie frage ich zeile für zeile bestimmte werte ab ?
    kannst du oder jemand mir einen einstig geben?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."

    • Offizieller Beitrag

    OK, hier mal ein Anfang. Mußt jetzt nur noch deine Logik einbauen und die Schreibbefehle für Excel. Das sollte aber anhand der vorigen Bsp. kein Problem werden.

    Spoiler anzeigen
    [autoit]

    #include <file.au3>

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

    ; die csv-Datei einlesen
    Local $Array, $PathCSV = @ScriptDir & '\test_csv.txt'
    _FileReadToArray($PathCSV, $Array)

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

    ; im Array an Index 0 steht die Anzahl der Zeilen
    ; an Index 1 steht die Überschrift
    ; somit beginnen die Daten an Index 2

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

    ; das Array durcharbeiten, Variable zum Splitten der Felder erstellen
    Global $aSplit ; Global, damit ByRef darauf zugegriffen werden kann
    ; zum besseren Verständnis erstelle ich hier Variablen für jedes Feld
    ; nicht zwingend notwendig, man kann auch direkt mit den Arrayvariablen arbeiten
    Global $TicketID, $CreateDate, $Submitter, $AssignInd, $AssignGrp, $Descript

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

    For $i = 2 To UBound($Array) -1
    $aSplit = StringSplit($Array[$i], ',')
    $TicketID = $aSplit[1]
    $CreateDate = $aSplit[2]
    $Submitter = $aSplit[3]
    $AssignInd = $aSplit[4]
    $AssignGrp = $aSplit[5]
    $Descript = $aSplit[6]
    ; jetzt die Auswertelogik, hier mal frei erfunden:
    Select
    Case StringInStr($Submitter, 'agent') And $AssignGrp = 'IT' And $Descript = 'admin'
    _AddToGroup('MAC')
    Case StringInStr($Submitter, 'agent') And $Descript = 'admin'
    _AddToGroup('ADMIN')
    ; usw.
    EndSelect
    Next

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

    Func _AddToGroup($Group)
    ; prüfen ob Sheet mit dem Gruppennamen existiert, wenn nicht erstellen
    ; Sheet aktivieren
    ; letzte belegte Zeile ermitteln (meine UDF: _ExcelBookGetWidth() )
    ; in Folgezeile schreiben Werte entsprechend der Variablen aus der For-Schleife: $TicketID, $CreateDate usw.
    EndFunc

    [/autoit]

    Edit: Hab noch was vereinfacht.

  • eine idee wie ich die agenten aus eine ini einlesen kann?
    wäre doch hilfreich eine idee?

    lg SubZero ;)
    ==========================================================================

    "Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral."