okieh-44
Goto Top

Daten aus csv auslesen und in andere csv oder xls wegschreiben

Hallo an alle Fachleute und Spezialisten,

ich möchte ein Problem mit VBA lösen und habe in den veröffentlichten Codes immer nur faaast das Passende gefunden.

Hier nun mein spezielles Problem. Ich habe eine Menge csv-Dateien, deren Struktur immer gleich ist. Nur bestimmte Zahlenwerte sind immer verschieden.
Ich möchte jetzt aus jeder csv-Datei z.B. den Wert in Zeile 1000, vor dem ersten Komma (was in Excel A:1000 wäre) auslesen und in eine neue csv-Datei in Zeile 1 an die erste Stelle schreiben. Dann den Wert aus Zeile 1001 in die erste Zeile der neuen csv an die zweite Stelle kommagetrennt usw. Das z.B. bis Zeile 1005 (und alles in die erste Zeile der neuen csv kommagetrennt).
Wenn fertig, kommt die nächste Datei aus der Dateiensammlung ran. Wieder Zeile 1000 bis 1005 auslesen und kommageternnt in die zweite Zeile der neuen csv schreiben usw. bis alle Dateien durch sind.

Ich hoffe, ich konnte die Aufgabe verständlich beschreiben. Übrigens, ich möchte die neu erstellte csv dann mit Excel weiterbearbeiten. Man könnte also auch gleich eine Exceldatei erzeugen und die einzelnen Werte in die Spalten A bis E eintragen. Die nächste Datei muss dann die nächste Zeile füllen.

Schonmal vielen Dank für Eure geschötzte Hilfe.
Gruß
OKIEH-44

Content-Key: 112644

Url: https://administrator.de/contentid/112644

Printed on: April 24, 2024 at 22:04 o'clock

Member: bastla
bastla Mar 29, 2009 at 13:52:30 (UTC)
Goto Top
Hallo OKIEH-44!

Als Batch etwa so:
@echo off & setlocal
set "Basis=D:\Deine CSV-Dateien"  
set "Typ=csv"  
set "Erg=D:\Gesamt"  
set /a Von=1000
set /a Bis=1005

set /a sk=Von-1
if exist "%Erg%" del "%Erg%"  
for %%i in ("%Basis%\*.%Typ%") do call :ProcessFile "%%i"  
move "%Erg%" "%Erg%.%Typ%"  
goto :eof

:ProcessFile
set Zeile=
for /f "skip=%sk% tokens=1,2 delims=:," %%a in ('findstr /n "^" %1') do call :ProcessLine %%a "%%b"  
>>"%Erg%" echo\%Zeile%  
goto :eof

:ProcessLine
if %1 gtr %Bis% goto :eof
set "Zeile=%Zeile%%~2%"  
if %1 lss %Bis% set "Zeile=%Zeile%,"  
goto :eof
bzw doch als VBA-Version:
Sub Sammle()
Basis = "D:\Deine CSV-Dateien"  
Typ = "csv" 'in Kleinbuchstaben  
Von = 1000
Bis = 1005

Zeile = 3 'Daten werden ab dieser Zeile eingetragen  
Set fso = CreateObject("Scripting.FileSystemObject")  
For Each Datei In fso.GetFolder(Basis).Files
    If LCase(fso.GetExtensionname(Datei.Name)) = Typ Then
        Spalte = 1'Daten werden ab dieser Spalte eingetragen  
        Inhalt = Split(Datei.OpenAsTextStream.ReadAll, vbCrLf)
        For i = Von - 1 To Bis - 1
            Cells(Zeile, Spalte) = Split(Inhalt(i), ",")(0)  
            Spalte = Spalte + 1
        Next
    End If
    Zeile = Zeile + 1
Next
End Sub
Grüße
bastla
Member: OKIEH-44
OKIEH-44 Mar 29, 2009 at 15:09:16 (UTC)
Goto Top
Hallo bastla,
vielen Dank für die schnelle Hilfe. Ich habe beide Codes getestet, allerdings nur mit wenig Erfolg.

Ich hab mir drei Test-Files csv angelegt. Zeile 1-3 sind mit zwei Werten kommagetrennt belegt.

Die Batch Datei liefert im cmd-Fenster folgenden Fehler:
"tokens=1,2 delims=:,"" ist syntaktisch an dieser Stelle nicht verarbeitbar"
Hier mein geänderter Code:

@echo off & setlocal
set "Basis=D:\Temp\versuch"
set "Typ=csv"
set "Erg=D:\Temp\versuch\Gesamt"
set /a Von=1
set /a Bis=3
set /a sk=Von-1
if exist "%Erg%" del "%Erg%"
for %%i in ("%Basis%\*.%Typ%") do call :ProcessFile "%%i"
move "%Erg%" "%Erg%.%Typ%"
goto :eof
:ProcessFile
set Zeile=
for /f "skip=%sk% tokens=1,2 delims=:," %%a in ('findstr /n "^" %1') do call :ProcessLine %%a "%%b"
"%Erg%" echo\%Zeile%
goto :eof
:ProcessLine
if %1 gtr %Bis% goto :eof
set "Zeile=%Zeile%%~2%"
if %1 lss %Bis% set "Zeile=%Zeile%,"
goto :eof

Die Ergebnisdatei csv wird angelegt, ist aber leer.

und hier mein geänderter Code für die Bearbeitung als Excelmakro:

Sub Sammle()
Basis = "D:\Temp\versuch"
Typ = "csv" 'in Kleinbuchstaben
Von = 1
Bis = 3

Zeile = 3 'Daten werden ab dieser Zeile eingetragen
Set fso = CreateObject("Scripting.FileSystemObject")
For Each Datei In fso.GetFolder(Basis).Files
If LCase(fso.GetExtensionname(alle.csv)) = Typ Then
Spalte = 1 'Daten werden ab dieser Spalte eingetragen
Inhalt = Split(Datei.OpenAsTextStream.ReadAll, vbCrLf)
For i = Von - 1 To Bis - 1
Cells(Zeile, Spalte) = Split(Inhalt(i), ",")(0)
Spalte = Spalte + 1
Next
End If
Zeile = Zeile + 1
Next
End Sub

Der Makroablauf bleibt schon in Zeile 1 hängen.

Hast Du einen Tipp für mich?
Gruß und Danke
OKIEH-44
Member: bastla
bastla Mar 29, 2009 at 15:33:37 (UTC)
Goto Top
Hallo OKIEH-44!

Zum Batch: Lass einfach das "skip=%sk%" vor "tokens" weg, dann klappt's auch mit einer "Von"-Zeile 1 (aufgrund Deiner Vorgabe "Zeile 1000" war ich nicht davon ausgegangen, dass Du in Zeile 1 beginnen würdest, und habe versucht, den Ablauf durch Überspringen der ersten 999 Zeilen zu beschleunigen).
Zum Makro: Etwas leichter ginge es, wenn Du auch eine Fehlermeldung anzubieten hättest. Sollte diese Meldung "Variable nicht definiert" lauten, müsstest Du nur ein allfälliges "Option Explicit" entfernen (oder für jede verwendete Variable per "Dim" eine Deklaration vornehmen).

[Edit]
Bei genauerer Betrachtung fällt mir noch die Zeile
If LCase(fso.GetExtensionname(alle.csv)) = Typ Then
auf - diese sollte unverändert geblieben sein, also:
If LCase(fso.GetExtensionname(Datei)) = Typ Then
[/Edit]

Grüße
bastla

P.S.: Zum Posten von Batches/Scripts hätte die Forensoftware eine passende ""-Formatierung zu bieten ...
Member: OKIEH-44
OKIEH-44 Mar 29, 2009 at 19:14:08 (UTC)
Goto Top
Hallo bastla,
das batch läuft mit meinen drei Testfiles gut durch. (Allgemeines Aufatmen...) Dann habe ich einen Versuch mit 35 echten csv-files durchlaufen lassen. Die betreffenden Zeilen sind 3602 bis 3605. Das funktioniert dann wieder mit Deinem ersten script.
Morgen folgt ein scharfer Durchlauf mit einigen hundert Dateien.
Bis hierhin schonmal herzlichen Dank für die Hilfe.
Ich werde berichten...
Gruß
OKIEH-44
Member: OKIEH-44
OKIEH-44 Mar 31, 2009 at 19:27:53 (UTC)
Goto Top
Hallo bastla,
funktioniert. Alles Super, vielen Dank.
Gruß
OKIEH-44