Bestimmte Zeilen einer CSV auslesen

Bild

Betrifft: Bestimmte Zeilen einer CSV auslesen
von: R.Schmitt
Geschrieben am: 14.02.2005 10:20:08
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

Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: Udo
Geschrieben am: 14.02.2005 11:43:47
Lies erst alles in ein Blatt und verteile dann, ist so am einfachsten.
Udo
Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: R.schmitt
Geschrieben am: 14.02.2005 11:54:39
Lieber Udo -
gerne - wenn Du mir sagst, wie ich über 300.000 Zeilen
in ein Arbeitsblatt bekomme.
Grüße
R.Schmitt
Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: Udo
Geschrieben am: 14.02.2005 12:04:29
Na ja, du weißt ja wohl selbst, dass das nicht möglich ist, ggf. Access nutzen.
Udo
Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: R.Schmitt
Geschrieben am: 14.02.2005 12:25:30
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
Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: Udo
Geschrieben am: 14.02.2005 13:52:31
Wüßte nicht, wie das gehen soll. Hab die Frage als noch offen gekennzeichnet.
Udo
Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: andre
Geschrieben am: 14.02.2005 18:04:52
Hallo R,
mit welchem code hast Du die Datei bisher eingelesen? Poste ihn mal, dann ändern wir das.
Grüße, andre
Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: R.schmitt
Geschrieben am: 16.02.2005 09:05:51
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
Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: EtoPHG
Geschrieben am: 16.02.2005 09:21:34
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
Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: R. Schmitt
Geschrieben am: 16.02.2005 10:04:29
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
Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: EtoPHG
Geschrieben am: 16.02.2005 12:01:23
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
Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: R.schmitt
Geschrieben am: 16.02.2005 12:40:11
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
Bild

Betrifft: AW: Bestimmte Zeilen einer CSV auslesen
von: EtoPHG
Geschrieben am: 16.02.2005 13:30:54
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
Bild

Betrifft: Mit iLenArtikelNr = 5 schon besser
von: R.schmitt
Geschrieben am: 16.02.2005 12:47:42
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
Bild

Betrifft: ...siehe letzte Meldung (o.T.)
von: EtoPHG
Geschrieben am: 16.02.2005 13:46:19

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Bestimmte Zeilen einer CSV auslesen"