Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Daten aus csv auslesen und in andere csv oder xls wegschreiben

Frage Microsoft Microsoft Office

Mitglied: OKIEH-44

OKIEH-44 (Level 1) - Jetzt verbinden

29.03.2009, aktualisiert 12:00 Uhr, 5001 Aufrufe, 5 Kommentare

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
Mitglied: bastla
29.03.2009 um 15:52 Uhr
Hallo OKIEH-44!

Als Batch etwa so:
01.
@echo off & setlocal 
02.
set "Basis=D:\Deine CSV-Dateien" 
03.
set "Typ=csv" 
04.
set "Erg=D:\Gesamt" 
05.
set /a Von=1000 
06.
set /a Bis=1005 
07.
 
08.
set /a sk=Von-1 
09.
if exist "%Erg%" del "%Erg%" 
10.
for %%i in ("%Basis%\*.%Typ%") do call :ProcessFile "%%i" 
11.
move "%Erg%" "%Erg%.%Typ%" 
12.
goto :eof 
13.
 
14.
:ProcessFile 
15.
set Zeile= 
16.
for /f "skip=%sk% tokens=1,2 delims=:," %%a in ('findstr /n "^" %1') do call :ProcessLine %%a "%%b" 
17.
>>"%Erg%" echo\%Zeile% 
18.
goto :eof 
19.
 
20.
:ProcessLine 
21.
if %1 gtr %Bis% goto :eof 
22.
set "Zeile=%Zeile%%~2%" 
23.
if %1 lss %Bis% set "Zeile=%Zeile%," 
24.
goto :eof
bzw doch als VBA-Version:
01.
Sub Sammle() 
02.
Basis = "D:\Deine CSV-Dateien" 
03.
Typ = "csv" 'in Kleinbuchstaben 
04.
Von = 1000 
05.
Bis = 1005 
06.
 
07.
Zeile = 3 'Daten werden ab dieser Zeile eingetragen 
08.
Set fso = CreateObject("Scripting.FileSystemObject") 
09.
For Each Datei In fso.GetFolder(Basis).Files 
10.
    If LCase(fso.GetExtensionname(Datei.Name)) = Typ Then 
11.
        Spalte = 1'Daten werden ab dieser Spalte eingetragen 
12.
        Inhalt = Split(Datei.OpenAsTextStream.ReadAll, vbCrLf) 
13.
        For i = Von - 1 To Bis - 1 
14.
            Cells(Zeile, Spalte) = Split(Inhalt(i), ",")(0) 
15.
            Spalte = Spalte + 1 
16.
        Next 
17.
    End If 
18.
    Zeile = Zeile + 1 
19.
Next 
20.
End Sub
Grüße
bastla
Bitte warten ..
Mitglied: OKIEH-44
29.03.2009 um 17:09 Uhr
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
Bitte warten ..
Mitglied: bastla
29.03.2009 um 17:33 Uhr
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 "Code"-Formatierung zu bieten ...
Bitte warten ..
Mitglied: OKIEH-44
29.03.2009 um 21:14 Uhr
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
Bitte warten ..
Mitglied: OKIEH-44
31.03.2009 um 21:27 Uhr
Hallo bastla,
funktioniert. Alles Super, vielen Dank.
Gruß
OKIEH-44
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows Server
Mailserver auf Windows Server 2012 (8)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...

DSL, VDSL
DSL-Signal bewerten (8)

Frage von SarekHL zum Thema DSL, VDSL ...