Auslesen CSV File - 'aufarbeiten' - einzelne Datensätze in verschiedenen (Web) Seiten sortiert anzeigen

  • Moin moin,
    ich komme irgendwie nicht so recht weiter - mir fehlt so der richtige Ansatz zur Lösung meines Problems.
    (Zur Zeit mache ich dies mehr od. weniger mannuell, wobei mir schon etwas länger die Idee vorschwebt einen Automatismus dafür zu erzeugen)

    Problembeschreibung:
    Ich bekomme täglich mehrmals csv Dateien (von verschiedenen Quellen aus HR). Diese sind vom Aufbau her (zum Glück) von meiner Seite genormt.
    Je nach Trigger/Schlüssel soll dieser Datensatz auf einer definierten Webpage angezeigt werden ....

    Also so sieht das jeweilige File prinzipiell aus.

    Trig - ProcNr - ProcName - DateStart - DateEnd - WebPage
    t1, 123, abc, 14.12.10, 15.12.10, intern
    t2, 456, abc, 14.12.10, 15.12.10, extern
    t3, 123, efg, 14.12.10, 15.12.10, intern
    t4, 789, xyz, 14.12.10, 15.12.10, intern
    t5, 123, lol, 14.12.10, 15.12.10, extern

    Jetzt sollten alle internen Prozesse (Merkmal = WebPage intern) auf die WebPage1 und die Externen auf Merkmal = WebPage2 (in sortierter Reihenfolge) übertragen werden.


    Meine Idee:
    das CSV in ein Array einlesen - nach intern/extern sortieren und dann solange alle Datensätze (=Zeilen) die mit z.B. intern aufgeführt sind in ein neues File schreiben (und dieses dann vom WebServer auslesen + darstellen lassen).

    Sortiertes Files sehen dann so aus ...
    Trig - ProcNr - ProcName - DateStart - DateEnd - WebPage
    t1, 123, abc, 14.12.10, 15.12.10, intern
    t3, 123, efg, 14.12.10, 15.12.10, intern
    t4, 789, xyz, 14.12.10, 15.12.10, intern


    Trig - ProcNr - ProcName - DateStart - DateEnd - WebPage
    t2, 456, abc, 14.12.10, 15.12.10, extern
    t5, 123, lol, 14.12.10, 15.12.10, extern

    Das Einlesen bzw. sortieren gelingt mir nicht ...


    Vielleicht kann ja jemand helfen oder hat einen Ansatz für mich

    DANKE

    Gruss
    ugt100

    Einmal editiert, zuletzt von ugt100 (15. Dezember 2010 um 16:31)

  • Ich nehme mal an in deinem csv - File stehen die Werte so oder so ähnlich drin:
    "Trig","ProcNr","ProcName","DateStart","DateEnd","WebPage"

    Also kannst du erstmal Zeile für Zeile auslesen und anhand vom feldtrenner (hier ,) splitten und nach und nach alles zusammen in ein 2D Array packen.(so dass dann zb $arr[zeileX][5] (laut diesem bsp) dein Wert "intern" oder "extern" wäre)

    Dann kannst du über dieses Array Iterieren und wenn der Wert für WebPage intern ist (oder extern, ist ja egal) schreibst du diesen Datensatz in ein 2. Array weg und löscht ihn aus diesem.

    So hast du am Schluss 2 Arrays, 1 mit Internen, 1 mit externen; alle Felder im Format "Feld".

    Dann nurnoch wieder rauschreiben, alle Felder mit , getrennt und du hast 2 Files im Format
    "Trig","ProcNr","ProcName","DateStart","DateEnd","WebPage"

    Edit:
    Ungefähr so:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Local $arrIntern[10][6], $arrExtern[10][6]
    Local $file, $fileIntern, $fileExtern, $lineCounter = 0

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

    $file = FileOpen("testfile.csv")
    $fileIntern = FileOpen("intern.csv", 1)
    $fileExtern = FileOpen("extern.csv", 1)
    While 1
    Local $line, $lineArr[6]
    $line = FileReadLine($file)
    $lineArr = StringSplit($line, ",")
    If @error Then ExitLoop
    If StringCompare($lineArr[6], '"intern"') == 0 Then
    _writeToFile($lineArr, "intern")
    Else
    _writeToFile($lineArr, "extern")
    EndIf
    $lineCounter += 1
    WEnd
    FileClose($fileIntern)
    FileClose($fileExtern)
    FileClose($file)

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

    Func _writeToFile($arr, $intExt)
    Local $stringToWrite = ""
    For $i = 1 To 6 Step 1
    If $i <> 6 Then
    $stringToWrite &= $arr[$i] & ","
    Else
    $stringToWrite &= $arr[$i]
    EndIf
    Next
    If $intExt = "intern" Then
    FileWriteLine($fileIntern, $stringToWrite)
    Else
    FileWriteLine($fileExtern, $stringToWrite)
    EndIf
    EndFunc ;==>_writeToFile

    [/autoit]

    8 Mal editiert, zuletzt von Milla (15. Dezember 2010 um 12:06)

  • Wenn du es nur in eine bzw zwei neue dateien schreiben willst und die einzelnen Felder nicht brauchst, kannst es auch so machen:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $file = FileRead("tempsource.txt")
    $testarray = StringRegExp($file, '(.*intern)', 3)
    _ArrayDisplay($testarray)
    $testarray = StringRegExp($file, '(.*extern)', 3)
    _ArrayDisplay($testarray)

    [/autoit]
  • Hi,

    das Problem hatte ich letztens auch. Ich zeig dir einfach mal meinen Ansatz wie ich alles in ein 2D Array geschrieben habe:

    [autoit]


    #include <array.au3>
    #include <string.au3>
    #include <file.au3>

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

    _FileReadToArray($FilePath, $Read_CSV) ;File in ein 1D Array lesen
    Dim $Daten[$Read_CSV[0]+1][6] ; 2D Array deklarieren. In diesem Fall so viele Zeilen wie das Array $Read_CSV und 6 Spalten.

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

    For $i = 1 to $Read_CSV[0] ;Alle Arrayfelder (das sind die Zeilen der CSV) durchgehen
    $Col_string = StringSplit($Read_CSV[$i], ",") ;Die Zeilen am Feldtrenner "," trennen und in ein neues Temporäres Array schreiben
    for $k = 1 to 5 ;Jetzt die Spalten in das Endgültige 2D Array schreiben
    $Value = $Col_string[$k]
    $Daten[$i][$k] = $Value
    Next
    Next ;Fertig

    [/autoit]

    Jetzt hast du die CSV in einem 2D Array. Nun musst du es nurnoch sortieren.

    Hoffe das hilft dir.

    Gruß Daniel

    Einmal editiert, zuletzt von danielsan85 (15. Dezember 2010 um 16:46)

  • Hallo zusammen,

    ein grosses Danke an alle die so schnell und 'hochwertig' geantwortet haben.

    Ich denke mit den aufgezeigten Wegen / Varianten, kann ich was anfangen und werde die Kuh vom Eis bekommen.
    Sollte dies wieder Erwarten nicht gelingen, wäre ich so frei und würde mich nochmal ans Forum hier wenden.


    Gruss und Danke
    ugt100
    :thumbup: - :)

    (P.S. dem gesamten Forum gehört ein grosses Lob in Sachen Qualität und Reaktionszeiten)