Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1868to1872
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Import große CSV

Import große CSV
09.02.2022 15:24:42
Theo
Hallo zusammen,
ich habe ein Tool gebaut, welches CSV Dateien einliest, und als neues (zusammengefügtes) CSV unter einem anderen Namen speichert.
Leider habe ich erst jetzt erfahren, dass manche CSV zu groß sind, um sie vollständig zu importieren.
In meinem Tool importiere ich jedes CSV einzeln in ein bestimmtes Worksheet, erzeuge das neue CSV bzw hänge die importierten Daten an das bestehende CSV an, bevor ich das nächste CSV importiere. Leider haben manche CSV nach dem Import 1048576 Zeilen in Excel - ich habe aber keine Ahnung, wieviele Zeilen nicht importiert wurden.
Der Import läuft momentan über folgendes Macro:

Sub ImportCSV(FileName, ws As Worksheet)
If FileName  False Then
Application.ScreenUpdating = False
ws.Cells.Clear
ws.Columns("A:AZ").NumberFormat = "@"
Workbooks.OpenText FileName:=FileName, Local:=True
ActiveSheet.UsedRange.Copy ws.Cells(1)
ActiveWorkbook.Close SaveChanges:=False
End If
End Sub
Das Neue CSV wird so erzeugt:

Function CreateCSV(strPath As String, strDateiname As String) As Boolean
Dim i As Long, lngZeile As Long, lngSpalte As Long, j As Long
Dim strZeile As String
Dim f As Integer
lngZeile = tbl_CSV.Cells(tbl_CSV.Rows.Count, 1).End(xlUp).Row
lngSpalte = tbl_CSV.Cells(1, Columns.Count).End(xlToLeft).Column
f = FreeFile
Open strPath & strDateiname For Output As #f
For i = 1 To lngZeile
For j = 1 To lngSpalte
If j  Empty Then
CreateCSV = True
End If
strZeile = ""
Next i
Close #1
End Function
Daten werden an das CSV so angehängt:

Function AppendCSV(strPath As String, strDateiname As String) As Boolean
Dim i As Long, lngZeile As Long, lngSpalte As Long, j As Long
Dim strZeile As String
Dim f As Integer
lngZeile = tbl_CSV.Cells(tbl_CSV.Rows.Count, 1).End(xlUp).Row
lngSpalte = tbl_CSV.Cells(1, Columns.Count).End(xlToLeft).Column
f = FreeFile
Open strPath & strDateiname For Append As #f
For i = 2 To lngZeile
For j = 1 To lngSpalte
If j  Empty Then
AppendCSV = True
End If
strZeile = ""
Next i
Close #1
End Function
Wie könnte ich die restlichen Datensätze erkennen und importieren?
Danke und Gruß
Theo

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: dazu nur (m)eine Vermutung, ...
09.02.2022 15:32:13
neopa
Hallo Theo,
... das was Du anstrebst, könnte (nur?) mit Hilfe der Nutzung der PowerQuery-Funktionalität und einer 64Bit-Excelversion funktionieren.
Gruß Werner
.. , - ...
AW: Import große CSV
09.02.2022 15:51:39
Sigi.21
Hallo Theo,
du könntest die csv-Datei auch DSatz für Satz einlesen und einen Zähler mitlaufen lassen. Bei 1 Mio. od. 750 Tsd. legst du eine neue Tabelle an.
Für das "Sichten" einer großen Textdatei (Anzahl DS, Feldtrenner) hatte ich mal was gemacht:

Sub TextdateiSichten()
Dim MsgTitel As String, MsgStil As Long, MsgText As String, TextS As String
Dim Datei As Variant, Satz As String, DS As Long, Nr As Long
Datei = Application.GetOpenFilename("Textdatei (*.csv; *.txt; *.*),*.csv; *.txt; *.*", , "Textdatei öffnen")
If Datei  False Then
DS = 0
Nr = FreeFile()
TextS = CStr(Datei) & ":" & vbCr
Open Datei For Input As #Nr
Do While Not EOF(Nr)
Line Input #Nr, Satz
DS = DS + 1
If DS 
Vielleicht hilft das etwas?
Gruß Sigi
Anzeige
AW: Import große CSV
09.02.2022 16:47:44
Zwenn
Hallo Theo,
gibt es einen bestimmten Grund, warum Du über eine Tabelle gehst? Wenn es nur darum geht, jeweils einen Text an einen anderen zu hängen, kannst Du das doch komplett im Arbeitsspeicher machen. Dann spielt die Anzahl der Zeilen keine Rolle mehr. Außerdem ist das wahrscheinlich wesentlich schneller.
Da am Ende auch Dateien entstehen, die mit Excel gar nicht mehr verarbeitet werden können, nehme ich an, das Ganze hat unterm Strich auch gar keinen Excelbezug oder? Du kannst mehrere Dateien nämlich auch einfach auf der Windows Konsole zu einer zusammenfassen.
Einfach, mit dem copy-Befehl:
https://praxistipps.chip.de/windows-dateien-zusammenfuegen-per-kommandozeile_38775
Etwas kryptischer:
https://socialmediaone.de/mehrere-textdateien-zusammenfuehren-in-sekunden-notepad-alternative
Viele Grüße,
Zwenn
Anzeige
AW: Import große CSV
09.02.2022 18:32:38
Theo
Hallo Zwenn,
Danke, so geht es natürlich auch, nützt mir aber leider nicht viel.
Es gibt mehrere Gründe warum ich das in VBA machen will.
1. Die CSV (hunderte davon) liegen in mehreren Unterordnern verteilt. Mein Tool "sammelt" die Dateien ein und verarbeitet sie automatisch
2. Alle CSV haben eine "Header"-Zeile. Die wird aber nur einmal benötigt
3. Der Prozess muss häufig wiederholt werden. Es ist natürlich einfacher, wenn der User nur einen Knopf drückt und das Ergebnis automatisch bekommt.
4. Dies ist nur ein Teilprozess. Der Gesamtprozess ist durch VBA automatisiert.
Grüße
Theo
Anzeige
AW: Import große CSV
09.02.2022 22:20:54
Yal
Moin,
Ich komme auf folgenden ominösen Code ... ohne irgendwas in Excel zu öffnen.

'FileSystemObject ist über Extras, Verweis, "Microsoft Scripting Runtime" zu haben
Dim FSO As FileSystemObject
Sub CSV_zusammenführen()
Dim F As File
Dim zTS As TextStream
Const cPfad = "C:\temp\H_for\Textdateien\"
Const cZielDatei = "AlleJahre.csv"
Set FSO = New FileSystemObject
Set zTS = FSO.OpenTextFile(cPfad & cZielDatei, ForAppending, True)
For Each F In FSO.GetFolder(cPfad).Files
If F.Name Like "Jahr_*" Then CSV_übertragen zTS, F.Path
Next
zTS.Close
End Sub
Sub CSV_übertragen(Zieldatei As TextStream, Quelldatei As String)
Dim qTS As TextStream
Dim zTS As TextStream
Set qTS = FSO.OpenTextFile(Quelldatei, ForReading)
qTS.ReadLine 'erste Zeile (Header) wir gelesen. Daraus machen wir nichts
Do While Not qTS.AtEndOfStream
Zieldatei.WriteLine qTS.ReadLine
Loop
qTS.Close
End Sub
VG
Yal
Anzeige
AW: Import große CSV
10.02.2022 10:36:29
Theo
Hallo Yal,
vielen Dank, das funzt perfekt!
Gruß Theo

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige