none
Import von csv Dateien per ADO mit Datumspalten RRS feed

  • Frage

  • Hallo,

    ich importiere diverse CSV Dateien per VBA aggriere und verknüpfte sie via sql und das Ergebnis übergebe ich aktuell in ein Array um es danach zellenweise in Excel auszugeben.

    Dieses Verfahren ist sehr langsam.

    Mein Problem  ist wenn ich den gesamten Array auf einmal übergebe, dann wird eine Datumsspalte die ein Datum enthält, als Text ausgeben.

    Wie kann ich das Vorgehen optimieren?

    vielen Dank

    Axel

    Donnerstag, 19. Februar 2015 08:59

Alle Antworten

  • Lies die CSV-Dateien via VBA direkt in ein Array und dieses schreibst Du ohne Umwege in die Tabelle.

    Falls Zahlen / Datum als Text auftauchen, dann wandel das Datum via Cdbl(CDate( in eine Zahl und numerische Werte via CDbl( in eine Zahl um.

    So kannst Du mehrere zehntausend Zeilen in 0,x Sekunden nach Excel schreiben:

      Set R = Range("A" & Rows.Count).End(xlUp).Offset(1)
      Data = ReadCSV(ThisFile)
      R.Resize(UBound(Data) + 1, UBound(Data, 2) + 1) = Data

    Natürlich musst Du die Tabelle vorher oder hinterher passend formatieren, sonst erscheint das Datum als Zahl.

    Andreas.

    Private Function ReadCSV(ByVal Fullname As String) As Variant
      'Read a CSV file into an array
      Const LDelim = vbCrLf 'Line delimiter
      Const FDelim = ";"    'Field delimiter
      Dim hFile As Integer
      Dim Buffer As String
      Dim Lines, Line, Data
      Dim i As Long, j As Long
      'Be sure the file exists
      If Dir(Fullname) = "" Then Exit Function
      'Open and read all data
      hFile = FreeFile
      Open Fullname For Binary Access Read As #hFile
      Buffer = Space(LOF(hFile))
      Get #hFile, , Buffer
      Close #hFile
      'Split into lines
      Lines = Split(Buffer, LDelim)
      'Split the first line and prepare the output
      'Note: I assume that all lines have the same number of fields
      Line = Split(Lines(0), FDelim)
      ReDim Data(0 To UBound(Lines), 0 To UBound(Line))
      For i = 0 To UBound(Lines)
        Line = Split(Lines(i), FDelim)
        For j = 0 To UBound(Line)
          'Parse the fields
          If IsDate(Line(j)) Then
            Data(i, j) = CDbl(CDate(Line(j)))
          ElseIf IsNumeric(Line(j)) Then
            Data(i, j) = CDbl(Line(j))
          Else
            Data(i, j) = Line(j)
          End If
        Next
      Next
      ReadCSV = Data
    End Function


    Donnerstag, 19. Februar 2015 11:11
  • ok, dann fällt aber die Verknüpfung, die ich im SQL bisher ber Left Join gemacht habe und die Aggregation der Daten auf Monatsebene weg.

    oder?

    Donnerstag, 19. Februar 2015 12:28
  • Das kommt darauf an von welcher Seite man es sieht... ich mutmaße mal das Du bisher via SQL und SELECT die Daten pro Monat gefilter hast.

    Wenn die Daten in Excel drin sind, dann kannst Du sehr einfach via Autofilter und =TEILERGEBNIS für jeden Monat z.B. eine Summe berechnen.

    Andreas.

    Donnerstag, 19. Februar 2015 14:35
  • die Aggregation auf Monatsebene mache ich um die Zeilen zu begrenzen. da ich ansonsten mehrere hundettausend Zeilen importieren würde.

    Donnerstag, 19. Februar 2015 15:54
  • Naja, was hindert Dich daran die CSV-Daten direkt zu analysieren, dann kannst Du gleich die entsprechenden verwerfen...

    Ist das gleiche in grün was Du jetzt auch machst, IMHO nur schneller.

    Andreas.

    Donnerstag, 19. Februar 2015 18:19