Alle Dateien in einem Verzeichnis zeilenweise auslesen
Hi zusammen,
da ich schon eine Weile nix mehr im Batch gemacht habe bin ich ein wenig raus und stehe auf dem Schlauch:
Ich habe ein Verzeichnis mit X CSV Dateien. Es handelt sich um eine Auswertung aus dem AD für Softwaregruppen. Die ersten drei Zeilen in den CSV Dateien sind immer irrelevant. Ich möchte nun alle Dateien Zeilenweise in eine neue Datei schreiben.
Außerdem möchte ich die Anzahl der gelesenen Zeilen zählen und zusammen mit dem Dateinamen der verarbeiteten Datei in eine neue Datei schreiben.
Zähler vermutlich so
funktioniert aber nicht und ich stehe gerade auf dem Schlauch ..
Einfach die Zeilen per PS zählen funktioniert auch nicht, weil auch leere Zeilen am Ende gezählt werden.
Und wenn ich einen Platzhalter angebe, erhalte ich die gesamt Zahl der Zeilen, was mir nicht hilft.
Hilfe ...
da ich schon eine Weile nix mehr im Batch gemacht habe bin ich ein wenig raus und stehe auf dem Schlauch:
Ich habe ein Verzeichnis mit X CSV Dateien. Es handelt sich um eine Auswertung aus dem AD für Softwaregruppen. Die ersten drei Zeilen in den CSV Dateien sind immer irrelevant. Ich möchte nun alle Dateien Zeilenweise in eine neue Datei schreiben.
for /f "usebackq skip=3 " %%i in (c:\Auswertung\20180409_1227\dateiname.csv) do echo %%i
Außerdem möchte ich die Anzahl der gelesenen Zeilen zählen und zusammen mit dem Dateinamen der verarbeiteten Datei in eine neue Datei schreiben.
Zähler vermutlich so
set/A count=%count%+1
for /f "usebackq skip=3 " %%i in (c:\Auswertung\20180409_1227\dateiname.csv) do echo %%i >>Dateiname2.csv && set/A "count=%count%+1"
funktioniert aber nicht und ich stehe gerade auf dem Schlauch ..
Einfach die Zeilen per PS zählen funktioniert auch nicht, weil auch leere Zeilen am Ende gezählt werden.
(get-content 'C:\Users\XXX\Desktop\PowerShellScripte\Auswertung\20180409_1227\_XXXXXX2013.csv').Count
Hilfe ...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 370536
Url: https://administrator.de/contentid/370536
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
14 Kommentare
Neuester Kommentar
Powershell
Und
Gruß schnuffi
Gci 'c:\Auswertung\20180409_122' -Filter *.csv | %{gc $_.Fullname | select -skip 3} | ?{$_ -notmatch "^\s*$"} | sc 'c:\gesamt.csv'
Gci 'c:\Auswertung\20180409_122' -Filter *.csv | %{"$((gc $_.Fullname | select -skip 3 | ?{$_ -notmatch "^\s*$"}).Count) : $($_.Name)"} | sc 'c:\Auswertung.csv'
Thema einlesen:
Für CSVs gibts ein extra cmdlet: Import-Csv
z.B. sowas:
Thema zählen:
Bei mir zählt er keine "leeren" - aber falls doch, kannst du da z.B sagen er soll nur bestimmte Zeilen zählen:
--> werden nur objekte geliefert, deren eigenschaft "Test" etwas enthält (Test = eine Überschrift in der CSV)
Nun, natürlich jetzt noch alles in eine Schleife verpacken
Für CSVs gibts ein extra cmdlet: Import-Csv
z.B. sowas:
Import-Csv -Path .\input.csv -Delimiter ";" | Select-Object -Skip 3
Thema zählen:
Bei mir zählt er keine "leeren" - aber falls doch, kannst du da z.B sagen er soll nur bestimmte Zeilen zählen:
$Inhalt = Import-Csv -Path .\input.csv -Delimiter ";" | Select-Object -Skip 3
$ZeilenAnzahl = ($Inhalt | Where-Object "Test").count
Nun, natürlich jetzt noch alles in eine Schleife verpacken
Zitat von @Nagus:
Wie drehe ich aber die Ausgabe um: erst den Dateinamen und dann die Anzahl der Zeilen?
So??
So ...Wie drehe ich aber die Ausgabe um: erst den Dateinamen und dann die Anzahl der Zeilen?
So??
Gci 'c:\Auswertung\20180409_122' -Filter *.csv | %{"$($_.Name) : $((gc $_.Fullname | select -skip 3 | ?{$_ -notmatch "^\s*$"}).Count)"} | sc 'c:\Auswertung.csv'
Kein wunder, da is ne Menge falsch ... vollkommen unausgeglichene Anführungszeichen intern nicht escaped und die Prozentzeichen für die Schleife nicht verdoppelt.
Denke immer daran du bist hier in einer Batchdatei bei der Sonderzeichen wie % escaped werden müssen sofern sie im Powershell-Teil vorkommen!
http://www.robvanderwoude.com/escapechars.php
Denke immer daran du bist hier in einer Batchdatei bei der Sonderzeichen wie % escaped werden müssen sofern sie im Powershell-Teil vorkommen!
powershell.exe -Exe ByPass -C "Gci '%pfad%\%runtime%' -Filter *.csv | %%{\"$($_.Name) : $((gc $_.Fullname | select -skip 3 | ?{$_ -notmatch '^\s*$'}).Count)\"} | sc '%pfad%\Auswertung.csv'"
p.s. was soll der Mischmasch?? Wenn du doch schon die Powershell nutzt mach es doch gleich ganz damit! Batch hat ausgedient wenn du damit arbeitest!
Hallo,
falls es doch lieber Batchscript sein soll:
Gruß
Friemler
falls es doch lieber Batchscript sein soll:
@echo off & setlocal
set "SrcDir=."
set "DstFile=.\Output\Result.csv"
set "LogFile=.\Logfile.log"
type NUL > "%DstFile%"
> "%LogFile%" (
for %%a in ("%SrcDir%\*.csv") do (
set /a Cnt=0
>> "%DstFile%" (
for /f "usebackq skip=3 tokens=* delims=" %%b in ("%%~a") do (
echo %%b
set /a Cnt+=1
)
)
setlocal enabledelayedexpansion
echo %%~a: !Cnt! Zeilen geschrieben
endlocal
)
)
Gruß
Friemler
Hallo Nagus,
ja klar, ich habe die Aufgabe so verstanden. Was soll denn stattdessen passieren bzw. wie ist die Regel, nach der aus dem Namen einer Ausgangsdatei der Name einer Ergebnisdatei erzeugt werden soll?
Grüße
Friemler
Zitat von @Nagus:
... allerdings sieht es so aus, als ob er den ganzen code in die Result.csv schreibt
... allerdings sieht es so aus, als ob er den ganzen code in die Result.csv schreibt
ja klar, ich habe die Aufgabe so verstanden. Was soll denn stattdessen passieren bzw. wie ist die Regel, nach der aus dem Namen einer Ausgangsdatei der Name einer Ergebnisdatei erzeugt werden soll?
Grüße
Friemler
Zu viele Details und ich weiß immer noch genauso viel/wenig wie vorher. Bitte halte Dir vor Augen, dass ich nichts über Deine Problemstellung und was mit der/den erzeugten Datei(en) passieren soll weiß und entsprechend keine Rückschlüsse ziehen kann, was zu tun ist.
Du musst mir einfach mal genau erklären, welche Daten wohin geschrieben werden sollen. Dass der Inhalt aller CSV-Dateien (außer den ersten drei Zeilen) in einer einzigen CSV-Datei landet entspricht wohl nicht Deiner Anforderung. Was dann?
Grüße
Friemler
Du musst mir einfach mal genau erklären, welche Daten wohin geschrieben werden sollen. Dass der Inhalt aller CSV-Dateien (außer den ersten drei Zeilen) in einer einzigen CSV-Datei landet entspricht wohl nicht Deiner Anforderung. Was dann?
- Eine CSV-Datei, die in der ersten Spalte den Namen einer Auswertungsdatei enthält und in der zweiten Spalte deren Zeilenanzahl minus 3.
- Eine CSV-Datei, die blockweise aufgebaut ist:
- Name einer Auswertungsdatei
- Darunter alle Zeilen dieser Datei (bis auf die ersten 3)
- Für jede Auswertungsdatei eine neue CSV-Datei (wie soll deren Name generiert werden?), die alle Zeilen der Auswertungsdatei enthält (bis auf die ersten 3).
- ...
Grüße
Friemler