CSV Datei aufteilen

  • Einen wunderschönen guten abend,
    ich habe eine csv datei, die ich gerne tabellarisch dargestellt haben möchte.
    mein problem ist, das pro zeile nur 3 werte stehen sollen und das die anzahl der werte nicht fest definiert ist...
    ich häng die csv mal mit dran
    ich hoffe ihr versteht was ich meine :)

    danke schon mal :)

  • Ich würde eigentlich behaupten, das die Datei gar keine CSV-Datei ist, bzw. eine mit hunderten von Elementen (Zahlen mit Komma, Elemente mit Semikolon getrennt) in einem Datensatz.

    Die einzelnen Datensätzen müssten bei einer CSV-Datei ja mit einem Zeilenvorschub getrennt sein und der fehlt in der Datei, egal ob Unix oder Windows Format.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Hi,
    ich schätze, so sollte es sein...

    Spoiler anzeigen
    [autoit]

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

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

    $array=stringsplit(fileread("test.csv"),";",3)
    $dim=int((ubound($array)-1)/3)+1

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

    dim $a[$dim][3]

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

    for $i=0 to $dim-1
    $a[$i][0]=$array[$i*3+0]
    $a[$i][1]=$array[$i*3+1]
    $a[$i][2]=$array[$i*3+2]
    next
    _arraydisplay($a)

    [/autoit]
  • Danke Andy genau so soll es aussehen :)
    Es sind x y z werte und unsere Messsoftware gibt die halt nur als csv aus allerdings möchte ich mir nicht die mühe machen und die datei von hand bearbeiten... gerade nicht wenn wir da bei einer wirklichen messung von ca 10.000 punkten reden.... gibt es jetzt eigentlich noch eine möglickeit die dinger in eine excel tabelle zu schreiben also spalte 1 immer der erste wert der array usw ??


    Danke schonmal :)

  • alsoo ich bin grade dabei das alles ein bisschen zu verschönern...
    folgendes problem ich habe am anfang ein "durchsuchenfeld" :D darunter einen button ok
    wenn ich auf den button ok klicke soll er den pfad der dann angegeben ist übernehmen...
    er tuts nicht :D

    hier mal der code:

    [autoit]

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

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

    ;$pfad = InputBox ("Datei wählen", "Pfad der *.csv angeben",".csv")

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

    $hGui = GUICreate("Gui", 390, 100)
    GUICtrlCreateLabel("Dateipfad:", 10, 22, 50, 20)
    $pfad = GUICtrlCreateInput("", 70, 20, 200, 20)
    $suchen = GUICtrlCreateButton("Durchsuchen", 280, 18, 90, 25)
    $ok=GUICtrlCreateButton("OK", 280, 55, 90, 25)
    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $suchen
    $pfad = FileOpenDialog("Bitte Datei auswählen...", @DesktopDir, "Alle (*.*)")
    If Not @error Then GUICtrlSetData($pfad, $pfad)
    EndSwitch
    WEnd

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

    $array=stringsplit(fileread($pfad),";",3)
    $dim=int((ubound($array)-1)/3)+1

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

    dim $a[$dim][3]

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

    for $i=0 to $dim-1
    $a[$i][0]=$array[$i*3+0]
    $a[$i][1]=$array[$i*3+1]
    $a[$i][2]=$array[$i*3+2]
    next
    _arraydisplay($a)

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

    Danke :)

  • moin moin,

    hatte mal genau das selbige Problem mit *.csv Dateien die Automatisch erstellt worden sind.
    Natürlich kannst du die auch in Excel einbinden und noch mehr.
    Ich weiss schon das ich da etwas übers Ziel hinausgehe mit dem Skript, soll dir halt nur zeigen was so möglich ist.

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <Excel.au3>

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

    #Region ### START Koda GUI section ### Form=
    $hGui = GUICreate("Gui", 391, 101, 192, 125)
    GUICtrlCreateLabel("Dateipfad:", 10, 22, 50, 20)
    $pfad = GUICtrlCreateInput("", 70, 20, 200, 21)
    $suchen = GUICtrlCreateButton("Durchsuchen", 280, 18, 90, 25)
    $ok = GUICtrlCreateButton("OK", 280, 63, 90, 25)
    GUICtrlCreateLabel("Erstellt von ", 8, 56, 58, 20)
    $name = GUICtrlCreateInput("keine Angabe", 71, 51, 200, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $suchen
    $oeffnen= FileOpenDialog("Bitte Datei auswählen...", @DesktopDir, "Alle (*.*)")
    If Not @error Then GUICtrlSetData($pfad, $oeffnen)
    Case $ok
    tabelle()
    EndSwitch
    WEnd

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

    Func tabelle()
    $ersteller = GUICtrlRead($name);------------------Aus der Inputbox ($name)lesen
    $file = @ScriptDir & "\test.xls"
    $fh = FileOpen($file, 1);-------------------------Leere Excel Tabelle erstellen
    FileClose($fh)
    $array=stringsplit(fileread($oeffnen),";",3)
    $dim=int((ubound($array)-1)/3)+1

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

    dim $a[$dim][3]
    $sFilePath1 = @ScriptDir & "\test.xls" ;----------Öffnen der Exel Tabelle
    $oExcel = _ExcelBookOpen($sFilePath1,1)

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

    for $i=0 to $dim-1
    $a[$i][0]=$array[$i*3+0]
    $oExcel.Cells($i+1,1).Value = $a[$i][0];--------Werte in die erste Spalte schreiben
    $a[$i][1]=$array[$i*3+1]
    $oExcel.Cells($i+1,2).Value = $a[$i][1];--------Werte in die zweite Spalte schreiben
    $a[$i][2]=$array[$i*3+2]
    $oExcel.Cells($i+1,3).Value = $a[$i][2];--------Werte in die dritte Spalte schreiben
    next
    $oExcel.ActiveCell.EntireRow.Insert(1);---------->fügt eine Zeile hinzu
    $oExcel.Cells(1, 1).Value = "Wert X " ;-----------Schreibt in eine Zelle (A1) einen Text
    $oExcel.Cells(1, 2).Value = "Wert Y" ;------------Schreibt in eine Zelle (B1) einen Text
    $oExcel.Cells(1, 3).Value = "Wert Z" ;------------Schreibt in eine Zelle (C1) einen Text
    $oExcel.Range("A1:I1" ).Select;-------------------Zellen (A1 bis I1) Makieren
    $oExcel.Selection.Font.Bold = True;---------------In Fett schreiben
    $oExcel.Range("B:B" ).Select;---------------------Makieren der Spalte (B)
    $oExcel.Selection.Interior.Color =0xCCCCCC;-------Die Spalte (B) in grau darstellen
    $oExcel.Range("B1" ).Select;-----------------------Makieren der Zelle (B1)
    $oExcel.Selection.Interior.Color =0xFFFFFF;-------Die Zelle (B1) wieder in weiß darstellen

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

    ;################## Einen Rahmen bauen zur besseren Darstellung ######################################
    $oExcel.Range("E1:I3" ).Select ; Rahmen
    $oExcel.Selection.Borders(7).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(7).Weight = -4138 ;xlMedium = -4138
    $oExcel.Selection.Borders(8).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(8).Weight = -4138 ;xlMedium = -4138
    $oExcel.Selection.Borders(9).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(9).Weight = -4138 ;xlMedium = -4138
    $oExcel.Selection.Borders(10).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(10).Weight = -4138 ;xlMedium = -4138
    $oExcel.Selection.Borders(11).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(11).Weight = -4138 ;xlMedium = -4138
    $oExcel.Selection.Borders(12).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(12).Weight = -4138 ;xlMedium = -4138
    ;############# ENDE Rahmen ###########################################################################

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

    $date = @MDAY & "." & @MON & "." & @YEAR;---------Das aktuelle Datum
    $time = @HOUR & ":" & @MIN;-----------------------Die aktuelle Zeit
    $oExcel.Cells(1, 5).Value = "Erstellt am " & " " & $date & " " & "um" & " " & $time & "Uhr" ;-----------Schreibt in eine Zelle (E1) einen Text
    $oExcel.Cells(2, 5).Value = "von" ;--------------Schreibt in eine Zelle (E2) einen Text
    $oExcel.Cells(3, 5).Value = $ersteller ;---------Schreibt die Variable von der Inputbox in die Zelle (E3)
    $oExcel.Range("E3" ).Select;---------------------Zelle (E3) Makieren
    $oExcel.Selection.Font.Bold = True;--------------In Fett schreiben
    $oExcel.Cells(2, 6).Value = "Höchster Wert" ;----Schreibt in eine Zelle (F2) einen Text
    $oExcel.Cells(3, 6).Value = "Niedrigster Wert" ;--Schreibt in eine Zelle (F3) einen Text
    $oExcel.Range("F2" ).Select;---------------------Zelle (F2) Makieren
    $oExcel.Selection.Font.Bold = True;--------------In Fett schreiben
    $oExcel.Range("F3" ).Select;---------------------Zelle (F3) Makieren
    $oExcel.Selection.Font.Bold = True;--------------In Fett schreiben
    $oExcel.Cells(1, 7).Value = "Wert X" ;-----------Schreibt in eine Zelle (G1) einen Text
    $oExcel.Cells(1, 8).Value = "Wert Y" ;-----------Schreibt in eine Zelle (H1) einen Text
    $oExcel.Cells(1, 9).Value = "Wert Z" ;-----------Schreibt in eine Zelle (I1) einen Text
    $oExcel.Cells(2, 7).Value = "=MAX(A2:A50)";------Schreibt in die Zelle (G2) den Höchsten wert aus Spalte A
    $oExcel.Cells(2, 8).Value = "=MAX(B2:B50)";------Schreibt in die Zelle (H2) den Höchsten wert aus Spalte B
    $oExcel.Cells(2, 9).Value = "=MAX(C2:B50)";------Schreibt in die Zelle (I2) den Höchsten wert aus Spalte C
    $oExcel.Cells(3, 7).Value = "=MIN(A2:A50)";------Schreibt in die Zelle (G3) den Kleinsten Wert aus Spalte A
    $oExcel.Cells(3, 8).Value = "=MIN(B2:B50)";------Schreibt in die Zelle (H3) den Kleinsten Wert aus Spalte B
    $oExcel.Cells(3, 9).Value = "=MIN(C2:C50)";------Schreibt in die Zelle (I3) den Kleinsten Wert aus Spalte C
    $oExcel.Range("A:AZ" ).Select ;------------------Makiert das Blatt von A bis AZ
    $oExcel.Selection.HorizontalAlignment = -4108 ;--setzt alles makierte auf mitte
    $oExcel.Selection.EntireColumn.AutoFit ;---------Passt die Zellengröße Automatisch an
    $oExcel.Range("D5" ).Select;---------------------Makieren der Zelle (D5)zur besseren Ansicht
    EndFunc;==>tabelle

    [/autoit]


    Habe auch mal versucht das so weit wie möglich zu kommentieren zumindest was das Excel angeht

    Edit: Sleep(50) raus genommen.Geht wohl auch so.

    mfg
    oh-ha

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit

    2 Mal editiert, zuletzt von oh-ha (13. Dezember 2011 um 14:02)

  • das ist natürlich schon sehr geil :)
    danke :D

    ehm... aber eins noch wie ist es zu realisieren, wenn ich nun über ein inputfeld sagen will ich habe nicht 3 sonder 4 spalten oder auch nur 2 ??
    und ne progressbar währe ein traum :D
    ich hoff ihr wisst was ich meine :)

    Einmal editiert, zuletzt von kappe1337 (13. Dezember 2011 um 18:25)

  • Geht natürlich alles muss man das ganze halt Variabler gestalten.
    Könnte man über eine combobox machen mit Auswahl 1 bis 10 oder wie viele Spalten du halt machen möchtest.
    Bei der progressbar schaue dir das mal in der Hilfe an " GUICtrlCreateProgress " ist da recht gut beschrieben.


    mfg
    oh-ha

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit

  • danke erstmal :)
    aber ich check das mit der progressbar nicht...
    woher weiss die denn wie weit er ist?? ich bekomm ja vorher nicht raus wie viele einträge da sind....
    oder steh ich nu einfach nur auf dem schlau :P

  • Wäre mal nett wenn du dein Skript mal hier rein stellst.

    Hast doch schon eine Schleife am laufen, nutze sie doch einfach. :D

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    #include <Excel.au3>

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

    #Region ### START Koda GUI section ### Form=
    $hGui = GUICreate("Gui", 391, 101, 192, 125)
    GUICtrlCreateLabel("Dateipfad:", 10, 22, 50, 20)
    $pfad = GUICtrlCreateInput("", 70, 20, 200, 21)
    $suchen = GUICtrlCreateButton("Durchsuchen", 280, 18, 90, 25)
    $ok = GUICtrlCreateButton("OK", 280, 63, 90, 25)
    GUICtrlCreateLabel("Erstellt von ", 8, 56, 58, 20)
    $name = GUICtrlCreateInput("keine Angabe", 71, 51, 200, 21)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $suchen
    $oeffnen= FileOpenDialog("Bitte Datei auswählen...", @DesktopDir, "Alle (*.*)")
    If Not @error Then GUICtrlSetData($pfad, $oeffnen)
    Case $ok
    tabelle()
    EndSwitch
    WEnd

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

    Func tabelle()
    ProgressOn("Progress Meter", "Increments every second", "0 percent"); ---Progressbar ein
    $ersteller = GUICtrlRead($name);------------------Aus der Inputbox ($name)lesen
    $file = @ScriptDir & "\test.xls"
    $fh = FileOpen($file, 1);-------------------------Leere Excel Tabelle erstellen
    FileClose($fh)
    $array=stringsplit(fileread($oeffnen),";",3)
    $dim=int((ubound($array)-1)/3)+1

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

    dim $a[$dim][3]
    $sFilePath1 = @ScriptDir & "\test.xls" ;----------Öffnen der Exel Tabelle
    $oExcel = _ExcelBookOpen($sFilePath1,1)

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

    for $i=0 to $dim-1
    ProgressSet( $i*2, $i*2 & " %");-------------------Werte für die Progressbar setzen
    sleep(100);----------------------------------------Damit bremse ich die ein wenig aus da man die nicht sehen könnte
    $a[$i][0]=$array[$i*3+0]
    $oExcel.Cells($i+1,1).Value = $a[$i][0];--------Werte in die erste Spalte schreiben
    $a[$i][1]=$array[$i*3+1]
    $oExcel.Cells($i+1,2).Value = $a[$i][1];--------Werte in die zweite Spalte schreiben
    $a[$i][2]=$array[$i*3+2]
    $oExcel.Cells($i+1,3).Value = $a[$i][2];--------Werte in die dritte Spalte schreiben
    next
    $oExcel.ActiveCell.EntireRow.Insert(1);---------->fügt eine Zeile hinzu
    $oExcel.Cells(1, 1).Value = "Wert X " ;-----------Schreibt in eine Zelle (A1) einen Text
    $oExcel.Cells(1, 2).Value = "Wert Y" ;------------Schreibt in eine Zelle (B1) einen Text
    $oExcel.Cells(1, 3).Value = "Wert Z" ;------------Schreibt in eine Zelle (C1) einen Text
    $oExcel.Range("A1:I1" ).Select;-------------------Zellen (A1 bis I1) Makieren
    $oExcel.Selection.Font.Bold = True;---------------In Fett schreiben
    $oExcel.Range("B:B" ).Select;---------------------Makieren der Spalte (B)
    $oExcel.Selection.Interior.Color =0xCCCCCC;-------Die Spalte (B) in grau darstellen
    $oExcel.Range("B1" ).Select;-----------------------Makieren der Zelle (B1)
    $oExcel.Selection.Interior.Color =0xFFFFFF;-------Die Zelle (B1) wieder in weiß darstellen

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

    ;################## Einen Rahmen bauen zur besseren Darstellung ######################################
    $oExcel.Range("E1:I3" ).Select ; Rahmen
    $oExcel.Selection.Borders(7).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(7).Weight = -4138 ;xlMedium = -4138
    $oExcel.Selection.Borders(8).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(8).Weight = -4138 ;xlMedium = -4138
    $oExcel.Selection.Borders(9).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(9).Weight = -4138 ;xlMedium = -4138
    $oExcel.Selection.Borders(10).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(10).Weight = -4138 ;xlMedium = -4138
    $oExcel.Selection.Borders(11).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(11).Weight = -4138 ;xlMedium = -4138
    $oExcel.Selection.Borders(12).LineStyle = 1 ;xlContinuous = 1
    $oExcel.Selection.Borders(12).Weight = -4138 ;xlMedium = -4138
    ;############# ENDE Rahmen ###########################################################################

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

    $date = @MDAY & "." & @MON & "." & @YEAR;---------Das aktuelle Datum
    $time = @HOUR & ":" & @MIN;-----------------------Die aktuelle Zeit
    $oExcel.Cells(1, 5).Value = "Erstellt am " & " " & $date & " " & "um" & " " & $time & "Uhr" ;-----------Schreibt in eine Zelle (E1) einen Text
    $oExcel.Cells(2, 5).Value = "von" ;--------------Schreibt in eine Zelle (E2) einen Text
    $oExcel.Cells(3, 5).Value = $ersteller ;---------Schreibt die Variable von der Inputbox in die Zelle (E3)
    $oExcel.Range("E3" ).Select;---------------------Zelle (E3) Makieren
    $oExcel.Selection.Font.Bold = True;--------------In Fett schreiben
    $oExcel.Cells(2, 6).Value = "Höchster Wert" ;----Schreibt in eine Zelle (F2) einen Text
    $oExcel.Cells(3, 6).Value = "Niedrigster Wert" ;--Schreibt in eine Zelle (F3) einen Text
    $oExcel.Range("F2" ).Select;---------------------Zelle (F2) Makieren
    $oExcel.Selection.Font.Bold = True;--------------In Fett schreiben
    $oExcel.Range("F3" ).Select;---------------------Zelle (F3) Makieren
    $oExcel.Selection.Font.Bold = True;--------------In Fett schreiben
    $oExcel.Cells(1, 7).Value = "Wert X" ;-----------Schreibt in eine Zelle (G1) einen Text
    $oExcel.Cells(1, 8).Value = "Wert Y" ;-----------Schreibt in eine Zelle (H1) einen Text
    $oExcel.Cells(1, 9).Value = "Wert Z" ;-----------Schreibt in eine Zelle (I1) einen Text
    $oExcel.Cells(2, 7).Value = "=MAX(A2:A50)";------Schreibt in die Zelle (G2) den Höchsten wert aus Spalte A
    $oExcel.Cells(2, 8).Value = "=MAX(B2:B50)";------Schreibt in die Zelle (H2) den Höchsten wert aus Spalte B
    $oExcel.Cells(2, 9).Value = "=MAX(C2:B50)";------Schreibt in die Zelle (I2) den Höchsten wert aus Spalte C
    $oExcel.Cells(3, 7).Value = "=MIN(A2:A50)";------Schreibt in die Zelle (G3) den Kleinsten Wert aus Spalte A
    $oExcel.Cells(3, 8).Value = "=MIN(B2:B50)";------Schreibt in die Zelle (H3) den Kleinsten Wert aus Spalte B
    $oExcel.Cells(3, 9).Value = "=MIN(C2:C50)";------Schreibt in die Zelle (I3) den Kleinsten Wert aus Spalte C
    $oExcel.Range("A:AZ" ).Select ;------------------Makiert das Blatt von A bis AZ
    $oExcel.Selection.HorizontalAlignment = -4108 ;--setzt alles makierte auf mitte
    $oExcel.Selection.EntireColumn.AutoFit ;---------Passt die Zellengröße Automatisch an
    $oExcel.Range("D5" ).Select;---------------------Makieren der Zelle (D5)zur besseren Ansicht
    ProgressSet(100 , "Done", "Fertig");----------------Fertig
    sleep(2000);----------------------------------------Damit man auch sehen kann das er fertig ist 2sec warten
    ProgressOff();-------------------------------------- und aus
    EndFunc;==>tabelle

    [/autoit]

    mfg
    oh-ha

    Es gibt drei Wahrheiten: deine Wahrheit, meine Wahrheit und die Wahrheit