Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Bestimmte Zeilen einer CSV auslesen

Forumthread: Bestimmte Zeilen einer CSV auslesen

Bestimmte Zeilen einer CSV auslesen
14.02.2005 10:20:08
R.Schmitt
Einen schönen Guten Morgen allerseits,
heute möchte ich aus einer CSV Datei bestimmte Zeilen
auslesen. Am Anfang jeder Zeile befindet sich die Artikel-
nummer.
Nun möchte ich also alle Zeilen mit Artikelnummer kleiner
50 in das erste Arbeitsblatt meiner Datei einlesen. Alle
kleiner 100 in das zweite und so weiter und so fort.
Wie stelle ich das denn an ?
Vielen Dank
R.Schmitt
Anzeige

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Bestimmte Zeilen einer CSV auslesen
14.02.2005 11:43:47
Udo
Lies erst alles in ein Blatt und verteile dann, ist so am einfachsten.
Udo
AW: Bestimmte Zeilen einer CSV auslesen
14.02.2005 11:54:39
R.schmitt
Lieber Udo -
gerne - wenn Du mir sagst, wie ich über 300.000 Zeilen
in ein Arbeitsblatt bekomme.
Grüße
R.Schmitt
AW: Bestimmte Zeilen einer CSV auslesen
14.02.2005 12:04:29
Udo
Na ja, du weißt ja wohl selbst, dass das nicht möglich ist, ggf. Access nutzen.
Udo
Anzeige
AW: Bestimmte Zeilen einer CSV auslesen
14.02.2005 12:25:30
R.Schmitt
Lieber Udo,
leider scheidet Access als "Krücke" aus.
Es sollte doch aber möglich sein, per
VBA ein csv einzulesen (soweit bin ich
zumindest schon selbst gekommen).
Nur daran, ihm (dem Rechner) zu sagen,
daß er nur dann einliest, wenn die Zeile
mit einer bestimmten Artiklenummer be -
ginnt hapert es bei mir.
Ich danke Dir
R.Schmitt
Anzeige
AW: Bestimmte Zeilen einer CSV auslesen
14.02.2005 13:52:31
Udo
Wüßte nicht, wie das gehen soll. Hab die Frage als noch offen gekennzeichnet.
Udo
AW: Bestimmte Zeilen einer CSV auslesen
14.02.2005 18:04:52
andre
Hallo R,
mit welchem code hast Du die Datei bisher eingelesen? Poste ihn mal, dann ändern wir das.
Grüße, andre
AW: Bestimmte Zeilen einer CSV auslesen
16.02.2005 09:05:51
R.schmitt
Lieber Andre,
zunächst muß ich an dieser Stelle Udo und dich um Verzeihung
bitten. Erstens handelt es sich bei der Datei um eine .txt
mit Tabstops (was ich wohl vorgestern im "Fieberwahn" ver-
wechselt habe) und zweitens antworte ich erst heute, da ich
vorgestern und gestern flach lag. Mal sehen, ob´s heute
besser geht (schnief)
Anbei der Code mit dem ich bisher eingelesen habe :

Sub Einspielen()
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;C:\Testdaten.txt" _
, Destination:=Range("A1"))
.Name = "Testdaten"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlWindows
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
.Refresh BackgroundQuery:=False
End With
End Sub

Nun ist die Liste aber deutlich länger als ein Arbeitsblatt
geworden ein Ausriß dieser Liste hier :
https://www.herber.de/bbs/user/18153.txt
Was ich tun möchte, ist alle Zeilen mit Artikel 1 in Blatt1
alle mit Artikel 2 in Blatt2 usw. einlesen.
Ich danke dir schonmal vielmals und wünsche
einen schönen Tag
R.Schmitt
Anzeige
AW: Bestimmte Zeilen einer CSV auslesen
16.02.2005 09:21:34
EtoPHG
Hallo R,
Was Du mit Deinem Code erreichst, ist dass das Query die GESAMTE .csv Datei einliest.
Mit dem Query kannst Du leider die Anzahl der Records nicht beschränken.
Frage ist die Textdatei aus einer DB extrahiert und hast Du au diese DB Zugriff ?
Wenn ja könnstest Du via ODBC und SQL auf diese DB zugreifen und dann die Aufteilung vornehmen. Eine andere Variante ist pro Artikel ein Textfile zu erstellen.
Oder aber mit VBA die Datei in mehrere zu splitten und dann einlesen.
Gruss Hansueli
Anzeige
AW: Bestimmte Zeilen einer CSV auslesen
16.02.2005 10:04:29
R. Schmitt
Lieber Hansueli,
ich habe keinen Zugriff auf die DB sondern bekomme
die Liste as is. Leider scheidet damit dein ODBC/SQL
Ansatz aus.
Bisher hatte ich ja auch nur die Notwendigkeit, die
Liste gesamt einzulesen. Nun (zu lang) muß ich sie
"zerlegen" und daran hakt´s.
Was ich tun will ist völlig richtig, die Liste per
VBA zu zerschnippeln und zwar in Abhängigkeit der
Artikelnummer. Wie gesagt - bis Artikelnr. X in
Blatt 1, bis Artikelnr. Y in Blatt 2 usw.
Any idea ?
Vielen Dank
R.Schmitt
Anzeige
AW: Bestimmte Zeilen einer CSV auslesen
16.02.2005 12:01:23
EtoPHG
Hallo R,
Mit diesem Code könnte es ev. hinhauen.
Passe die Länge der Artikelnummern und ev der Filennamen an.
Option Explicit

Sub EinlesenInTeilen()
Dim sInputFName As String
Dim sOutputFile As String
Dim sOutputFName As String
Dim sInpRecord As String
Dim iLenArtikelNr As Integer
Dim iSplittCnt As Integer
Dim iFileNr As Integer
Dim dRecCnt As Double
Dim dArtikelNr As Double
Dim bOutputOpen As Boolean
sInputFName = "C:\TestGesamt.txt"       'Name der Gesamtdatei
sOutputFile = "C:\Teil"                 'Erster Teil der gesplitteten Files (wird ergänzt mit Laufnummer und .txt)
iLenArtikelNr = 7                       'Länge der Artikelnummer
iSplittCnt = 50                         'Nach N Wert neues Blatt/File
Open sInputFName For Input As #1
While Not EOF(1)
iFileNr = iFileNr + 1
sOutputFName = sOutputFile & Trim(Str(iFileNr)) & ".txt"
Open sOutputFName For Output As #2
bOutputOpen = True
Input #1, sInpRecord
dArtikelNr = Val(Left(sInpRecord, iLenArtikelNr))
While dArtikelNr + iSplittCnt > Val(Left(sInpRecord, iLenArtikelNr)) And Not EOF(1)
Write #2, sInpRecord
Input #1, sInpRecord
Wend
Close #2
bOutputOpen = False
Application.StatusBar = "Output : " & sOutputFName & " Datensätze verarbeitet: " & dRecCnt
Call SplittImport(sOutputFName, iFileNr)
Wend
Close #1
If bOutputOpen Then
Close #2
Call SplittImport(sOutputFName, iFileNr)
End If
End Sub


Sub SplittImport(sFName As String, iNr As Integer)
'   Importiert File erstellt neues Blatt
ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count)
Sheets(Worksheets.Count).Activate
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & sFName _
, Destination:=ActiveSheet.Range("A1"))
.Name = "Test" & Trim(Str(iNr))
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlWindows
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
.Refresh BackgroundQuery:=False
End With
End Sub

Gruss Hansueli
Anzeige
AW: Bestimmte Zeilen einer CSV auslesen
16.02.2005 12:40:11
R.schmitt
Lieber Hansueli,
anbei das Ergebnis https://www.herber.de/bbs/user/18166.xls
Läuft irgendwie nicht ganz so, wie geplant. Ich habe den
Eindruck, er zerschnippelt die Liste "willkürlich" konnte
aber bisher noch nicht erkennen, warum.
Viele Grüße
R.Schmitt
Anzeige
AW: Bestimmte Zeilen einer CSV auslesen
16.02.2005 13:30:54
EtoPHG
Hallo R,
OK, den Code hab ich nur mal schnell während meiner regulären Arbeit hingebastelt.
Also so wie's aussieht ist Deine Artikelnummer, das 2te Feld (ab Position 3 im Record) und ist 6 stellig. Der folgende Code trägt dem Rechnung, zudem splittet er nun in Gruppen von 50 (d.h. wenn die Artikelnummer in 50er Schritten in den letzten beiden Zahlen wechselt). Ich weiss ja nicht wie Deine Artikelnummer aufgebaut ist, aber mit dem Wert der Variablen iSplittCnt lässt sich dass einstellen.
Option Explicit

Sub EinlesenInTeilen()
Dim sInputFName As String
Dim sOutputFile As String
Dim sOutputFName As String
Dim sInpRecord As String
Dim iLenArtikelNr As Integer
Dim iPosArtikelNr As Integer
Dim iSplittCnt As Integer
Dim iFileNr As Integer
Dim dRecCnt As Double
Dim dArtikelNr As Double
Dim bOutputOpen As Boolean
sInputFName = "C:\TestGesamt.txt"       'Name der Gesamtdatei
sOutputFile = "C:\Teil"                 'Erster Teil der gesplitteten Files (wird ergänzt mit Laufnummer und .txt)
iPosArtikelNr = 3                       'Position der Artikelnummer im Record
iLenArtikelNr = 6                       'Länge der Artikelnummer
iSplittCnt = 50                         'Nach N Wert neues Blatt/File
Open sInputFName For Input As #1
While Not EOF(1)
iFileNr = iFileNr + 1
sOutputFName = sOutputFile & Trim(Str(iFileNr)) & ".txt"
Open sOutputFName For Output As #2
If Len(sInpRecord) > 0 Then Write #2, sInpRecord
bOutputOpen = True
Input #1, sInpRecord
While iSplittCnt * iFileNr > Val(Mid(sInpRecord, iPosArtikelNr, iLenArtikelNr)) And Not EOF(1)
Write #2, sInpRecord
Input #1, sInpRecord
Wend
Close #2
bOutputOpen = False
Application.StatusBar = "Output : " & sOutputFName & " Datensätze verarbeitet: " & dRecCnt
Call SplittImport(sOutputFName, iFileNr)
Wend
Close #1
If bOutputOpen Then
Close #2
Call SplittImport(sOutputFName, iFileNr)
End If
End Sub


Sub SplittImport(sFName As String, iNr As Integer)
'   Importiert File erstellt neues Blatt
ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count)
Sheets(Worksheets.Count).Activate
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;" & sFName _
, Destination:=ActiveSheet.Range("A1"))
.Name = "Test" & Trim(Str(iNr))
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = xlWindows
.TextFileStartRow = 1
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = True
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = False
.TextFileSpaceDelimiter = False
.TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1)
.Refresh BackgroundQuery:=False
End With
End Sub

Hoffe das ist jetzt ein Gerüst, mit dem Du weiterarbeiten kannst.
Gruss Hansueli
Anzeige
Mit iLenArtikelNr = 5 schon besser
16.02.2005 12:47:42
R.schmitt
Mit iLenArtikelNr = 5 findet zumindest schonmal ein
Wechsel bei jeder neuen Artikelnummer statt.
Das Ergebnis sieht jedoch immer noch so aus, daß alle
Werte in ein und der selben Zelle stehen.
Was müßte ich den tun, um einen Blattwechsel nur bei
bestimmten Artikelnummern zu erhalten.
Also Artikelnr. 1 bis 10 in Blatt1 und 11 bis 12 in
Blatt 2 ?
Viele Grüße
R.Schmitt
Anzeige
...siehe letzte Meldung (o.T.)
16.02.2005 13:46:19
EtoPHG
;
Anzeige

Infobox / Tutorial

Bestimmte Zeilen einer CSV auslesen in Excel


Schritt-für-Schritt-Anleitung

Um bestimmte Zeilen einer CSV oder TXT-Datei auszulesen, kannst du VBA verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. Öffne Excel und erstelle ein neues Arbeitsblatt.

  2. Drücke ALT + F11, um den VBA-Editor zu öffnen.

  3. Füge ein neues Modul hinzu:

    • Rechtsklick auf "VBAProject (DeinWorkbookName)".
    • Wähle Einfügen > Modul.
  4. Kopiere den folgenden Code in das Modul:

    Sub EinlesenInTeilen()
        Dim sInputFName As String
        Dim sOutputFile As String
        Dim sOutputFName As String
        Dim sInpRecord As String
        Dim iLenArtikelNr As Integer
        Dim iSplittCnt As Integer
        Dim iFileNr As Integer
    
        sInputFName = "C:\TestGesamt.txt"       ' Name der Gesamtdatei
        sOutputFile = "C:\Teil"                 ' Erster Teil der gesplitteten Files
        iLenArtikelNr = 6                       ' Länge der Artikelnummer
        iSplittCnt = 50                         ' Nach N Wert neues Blatt/File
    
        Open sInputFName For Input As #1
        While Not EOF(1)
            iFileNr = iFileNr + 1
            sOutputFName = sOutputFile & Trim(Str(iFileNr)) & ".txt"
            Open sOutputFName For Output As #2
            Input #1, sInpRecord
            While Val(Mid(sInpRecord, 3, iLenArtikelNr)) <= iFileNr * iSplittCnt And Not EOF(1)
                Write #2, sInpRecord
                Input #1, sInpRecord
            Wend
            Close #2
            Application.StatusBar = "Output : " & sOutputFName
        Wend
        Close #1
    End Sub
  5. Passe die Parameter an: Ändere den sInputFName und die Länge der Artikelnummer (iLenArtikelNr) nach deinen Bedürfnissen.

  6. Führe das Makro aus: Drücke F5, um das Makro auszuführen.


Häufige Fehler und Lösungen

  • Fehler: "File not found"

    • Lösung: Stelle sicher, dass der Pfad zur Datei korrekt ist und die Datei existiert.
  • Fehler: "Type mismatch"

    • Lösung: Überprüfe, ob die Artikelnummern in der Datei korrekt formatiert sind und keine unerwarteten Zeichen enthalten.
  • Fehler: Alle Daten in einer Zelle

    • Lösung: Stelle sicher, dass die Datei im richtigen Format (z.B. Tab- oder Komma-getrennt) vorliegt.

Alternative Methoden

Falls der VBA-Weg nicht funktioniert oder du eine andere Methode bevorzugst, kannst du auch:

  • Power Query verwenden, um CSV-Dateien zu importieren und zu filtern. Power Query ist in Excel integriert und ermöglicht eine benutzerfreundliche Datenbearbeitung.
  • Access verwenden, um große Datenmengen zu verwalten und dann die benötigten Daten in Excel zu exportieren.

Praktische Beispiele

Hier ist ein einfaches Beispiel, wie du die Artikelnummern in verschiedene Blätter aufteilen kannst:

Sub SplittImport(sFName As String, iNr As Integer)
    ActiveWorkbook.Sheets.Add after:=Worksheets(Worksheets.Count)
    Sheets(Worksheets.Count).Activate
    With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;" & sFName, Destination:=ActiveSheet.Range("A1"))
        .Name = "Test" & Trim(Str(iNr))
        .FieldNames = True
        .Refresh BackgroundQuery:=False
    End With
End Sub

Tipps für Profis

  • Nutze Variablen: Halte deinen Code flexibel, indem du Variablen für Dateipfade und Artikelnummernlängen verwendest.
  • Fehlerbehandlung: Füge On Error Resume Next hinzu, um den Code robuster zu machen und Fehler zu ignorieren oder gezielt zu behandeln.
  • Dokumentation: Kommentiere deinen Code, damit du und andere ihn leichter verstehen können.

FAQ: Häufige Fragen

1. Wie kann ich mehrere CSV-Dateien gleichzeitig verarbeiten?
Du kannst eine Schleife im VBA-Code hinzufügen, die alle CSV-Dateien in einem bestimmten Verzeichnis durchläuft.

2. Was mache ich, wenn die Daten nicht korrekt importiert werden?
Überprüfe die Trennzeichen in deiner CSV-Datei und stelle sicher, dass sie korrekt im Code angegeben sind.

3. Ist VBA in allen Excel-Versionen verfügbar?
Ja, VBA ist in den meisten Versionen von Excel verfügbar, aber die genaue Funktionalität kann je nach Version variieren.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige