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, 5030 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 ..
Ähnliche Inhalte
Batch & Shell
Per Batch in Aufgabeplanung XLS in CSV umwandeln (21)

Frage von dtbsys zum Thema Batch & Shell ...

XML
gelöst CSV bzw. XLS Dateien in ein XML Schema einbinden (3)

Frage von fisi-flo zum Thema XML ...

Windows Userverwaltung
gelöst Ordnergruppenfreigaben in CSV oder HTML auslesen (3)

Frage von JafThomas zum Thema Windows Userverwaltung ...

Batch & Shell
gelöst Batch xls nach aktuellem Datum auslesen und email senden (14)

Frage von michi-ffm zum Thema Batch & Shell ...

Neue Wissensbeiträge
Windows Server

Umstellung SHA 1 auf SHA 2 - Migration der CA von CSP auf KSP

Tipp von Badger zum Thema Windows Server ...

Windows 10

Quato DTP94 unter Windows 10 x64 installieren und verwenden

Anleitung von anteNope zum Thema Windows 10 ...

Windows 10

Win10 1703 und Nutzerkennwörter bei Ersteinrichtung - erstaunliche Erkenntnis

(15)

Erfahrungsbericht von DerWoWusste zum Thema Windows 10 ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
CNC Maschinen verlieren Netzwerkverbindung (kurioser Fehler) (21)

Frage von NoHopeNoFear zum Thema LAN, WAN, Wireless ...

Webentwicklung
Aktuellen Mitarbeiter auf Homepage anzeigen (12)

Frage von alemanne21 zum Thema Webentwicklung ...