Vbscript Textfile auslesen Zeilen zählen und Werte austauschen
Hallo Kollegen
Ich bin daran über eine Batch mehrere *.csv Dateien in einem Ordner zu einer neu.csv zusammenzuführen. Dabei ermittle ich noch die Zeilenanzahl der neu.csv und möchte nun diesen ermittelten Wert der Zeilenanzahl in der ersten Zeile der neu.csv eintragen bzw. einen bereits hinterlegten wert mit meinem ermittelten Wert austauschen. Hier ist genau der Knackpunkt dies bekomme ich per Batch nicht hin.
Wie könnte ich dies mit vbscript realisieren ?
Nachfolgend der Code der bisher erstellt wurde.
setlocal
set "Ordner=c:\test"
REM Zusamenfuehren der CSV Dateien
set "Sammel=c:\test1\DeineSammeldatei.csv"
pushd "%Ordner%"
if exist "%Sammel%" del "%Sammel%"
for %%i in (*.txt) do if not exist "%Sammel%" for /f "usebackq delims=" %%z in ("%%i") do if not exist "%Sammel%" echo %%z>"%Sammel%"
for %%i in (*.txt) do more +1 "%%i">>"%Sammel%"
popd
REM zählen der Zeilen der Zusammengefuehrten CSV
Set /A "Counter=0"
FOR /F "delims=" %%A IN (c:\test1\Deine.csv) DO SET /A "Counter+=1"
Set /A "Counter-=1"
echo %Counter% Zeilen
echo 'Anzahl Zeilen: ' . count ($zeilen)
Pause
Ich bin daran über eine Batch mehrere *.csv Dateien in einem Ordner zu einer neu.csv zusammenzuführen. Dabei ermittle ich noch die Zeilenanzahl der neu.csv und möchte nun diesen ermittelten Wert der Zeilenanzahl in der ersten Zeile der neu.csv eintragen bzw. einen bereits hinterlegten wert mit meinem ermittelten Wert austauschen. Hier ist genau der Knackpunkt dies bekomme ich per Batch nicht hin.
Wie könnte ich dies mit vbscript realisieren ?
Nachfolgend der Code der bisher erstellt wurde.
setlocal
set "Ordner=c:\test"
REM Zusamenfuehren der CSV Dateien
set "Sammel=c:\test1\DeineSammeldatei.csv"
pushd "%Ordner%"
if exist "%Sammel%" del "%Sammel%"
for %%i in (*.txt) do if not exist "%Sammel%" for /f "usebackq delims=" %%z in ("%%i") do if not exist "%Sammel%" echo %%z>"%Sammel%"
for %%i in (*.txt) do more +1 "%%i">>"%Sammel%"
popd
REM zählen der Zeilen der Zusammengefuehrten CSV
Set /A "Counter=0"
FOR /F "delims=" %%A IN (c:\test1\Deine.csv) DO SET /A "Counter+=1"
Set /A "Counter-=1"
echo %Counter% Zeilen
echo 'Anzahl Zeilen: ' . count ($zeilen)
Pause
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 176757
Url: https://administrator.de/contentid/176757
Ausgedruckt am: 22.11.2024 um 07:11 Uhr
17 Kommentare
Neuester Kommentar
Aloha,
irgendwie machen mich so einige Dinge heute konfus aber um eine bessere Übersicht zu bekommen, wäre es von Vorteil, wenn du denen bisherigen Code in ##blue|##-Formatierung setzt und wenn ich jetzt noch einmal genau entwuselt habe, welchen Wert du wo jetzt austauschen willst, will ich meinen, dass das dennoch mit Batch realisierbar ist
aber plainskript schaue ich mir prinzipiell nicht mehr an, da schaltet mein Gehirn in den read-only-mode
greetz André
edit: @bastla, läuft auf dasselbe hinaus read-only bedeutet ja, dass keine Verarbeitung stattfindet, ergo ist es wie es nicht gelesen zu haben
irgendwie machen mich so einige Dinge heute konfus aber um eine bessere Übersicht zu bekommen, wäre es von Vorteil, wenn du denen bisherigen Code in ##blue|##-Formatierung setzt und wenn ich jetzt noch einmal genau entwuselt habe, welchen Wert du wo jetzt austauschen willst, will ich meinen, dass das dennoch mit Batch realisierbar ist
aber plainskript schaue ich mir prinzipiell nicht mehr an, da schaltet mein Gehirn in den read-only-mode
greetz André
edit: @bastla, läuft auf dasselbe hinaus read-only bedeutet ja, dass keine Verarbeitung stattfindet, ergo ist es wie es nicht gelesen zu haben
Hallo u0206084!
Du kannst nicht eine bestehende Datei editieren (auch nicht mit VBScript), sondern nur die Datei neu erstellen - daher etwa per:
Grüße
bastla
P.S.: Da ja in einer CSV keine Leerzeilen zu erwarten (bzw im Fall des Falles vermutlich nicht zu zählen) sind, spare ich mir den Tipp, das Zeilenzählen per
[Edit] @skye: ... und ich hatte gedacht in den ignore-completely-mode ... [/Edit]
[Edit2] @skye
[/Edit2]
Du kannst nicht eine bestehende Datei editieren (auch nicht mit VBScript), sondern nur die Datei neu erstellen - daher etwa per:
move "%Sammel%" %temp%\Sammel.txt
>"%Sammel%" echo 'Anzahl Zeilen: ' . count (%Counter%)
>>"%Sammel%" type %temp%\Sammel.txt
bastla
P.S.: Da ja in einer CSV keine Leerzeilen zu erwarten (bzw im Fall des Falles vermutlich nicht zu zählen) sind, spare ich mir den Tipp, das Zeilenzählen per
findstr /n "^"
vorzunehmen ... [Edit] @skye: ... und ich hatte gedacht in den ignore-completely-mode ... [/Edit]
[Edit2] @skye
read-only bedeutet ja, dass keine Verarbeitung stattfindet
Das bezieht sich jetzt aber nicht auf die Leser gewisser Zeitungen, nehme ich an ... [/Edit2]
moin,
erstma Sammlen hmmm
mit etwas weniger Produktivzeilen würde der Batch so reichen (wenn die Letze Zeile nur eine Zeilenschaltung hat bzw nur ein CR)
Gruß Phil
erstma Sammlen hmmm
set /a counter = 0
set /a counter - = 1
was soll denn erst diese Aufrechnerei der ersten Zeile, wenn diese am Ende Ersetzt bzw nicht mitgezählt wird (gleich bei -1 Anfangen oder ...)set /a counter - = 1
mit etwas weniger Produktivzeilen würde der Batch so reichen (wenn die Letze Zeile nur eine Zeilenschaltung hat bzw nur ein CR)
@echo off
pushD "C:\test"
>"D:\Sammel.csv" (
<nul set/p="Anzahl Zeilen: "
(
for %%i in (*.txt) do @more +1 "%%i"|findstr /v /r /c:"^[ ]*$"
)|find /c /v ""
for %%i in (*.txt) do @more +1 "%%i"|findstr /v /r /c:"^[ ]*$"
)
Gruß Phil
Hallo u0206084!
verwendest ...
Zur Zeile 3 hätten wir übrigens sogar das passende Echo ohne Zeilenumbruch und ähnliche Spielereien im Angebot ...
Grüße
bastla
was all das genau bedeutet
Vielleicht wird's ja etwas deutlicher, wenn Du einfach nur@echo off
>"D:\Sammel.csv" (
<nul set/p="Anzahl Zeilen: "
(
for %%i in ("C:\test\*.txt") do @more +1 "%%i"
)|find /c /v ""
for %%i in ("C:\test\*.txt") do @more +1 "%%i"
)
Zur Zeile 3 hätten wir übrigens sogar das passende Echo ohne Zeilenumbruch und ähnliche Spielereien im Angebot ...
Grüße
bastla
moin Martin,
sorry - das PopD war mir durch die Lappen gegangen
Ungetestet vllt etwa so
[Edit]
SET aus der FOR mit Verkettung entfernt
Edit]
Gruß Phil
sorry - das PopD war mir durch die Lappen gegangen
Ungetestet vllt etwa so
@echo off &setlocal
for %%i in ("C:\test\*.txt") do if not defined line1 <"%%i" set /p line1=
(for %%i in ("C:\test\*.txt") do more +1 "%%i" )|find /c /v "">"%Temp%\csv"
<"%temp%\csv" set /p "lines="
>"D:\Sammel.csv" (
for /f "tokens=1-3*delims=;" %%i in ("%lines%;%line1%") do echo %%j;%%i;%%l
for %%i in ("C:\test\*.txt") do more +1 "%%i"
)
SET aus der FOR mit Verkettung entfernt
Edit]
Gruß Phil
moin,
hach - jetzt weis ich warum ich erst das @drinhatte
in Zeile 04 fehlt das @ vor dem more - für das Ausblenden eines Befehles um diesen selbst nicht anzuzeigen. Obwohl echo OFF ist wird der Befehl ohne das Geführte @ als Zeile gezählt. Das wiederum nur weil die Befehle aus der For Anweisung stammen und die nachfolgenden Verketteten Befehle Eingaben; Ausgaben sowie Handle 3 verarbeiten.
in der CMD-Line
<code type =plain>
abc
abc
abc
abc
(for /l %i in (1 1 4) do echo abc)|findstr /n "^"
1:
2:>echo abc
3:abc
4:
5:>echo abc
6:abc
7:
8:>echo abc
9:abc
10:
11:>echo abc
12:abc
(for /l %i in (1 1 4) do >nul echo abc)|findstr /n "^"
1:
2:>echo abc 1>nul
3:
4:>echo abc 1>nul
5:
6:>echo abc 1>nul
7:
8:>echo abc 1>nul
(for /l %i in (1 1 4) do @echo abc)|findstr /n "^"
1:abc
2:abc
3:abc
4:abc
das wären die 8 zuvielen Zeilen.
wenn die 9. zuviele Zeile wegsoll musst Du die Leerzeilen der Dateien entfernen
Gruß Phil
hach - jetzt weis ich warum ich erst das @drinhatte
in Zeile 04 fehlt das @ vor dem more - für das Ausblenden eines Befehles um diesen selbst nicht anzuzeigen. Obwohl echo OFF ist wird der Befehl ohne das Geführte @ als Zeile gezählt. Das wiederum nur weil die Befehle aus der For Anweisung stammen und die nachfolgenden Verketteten Befehle Eingaben; Ausgaben sowie Handle 3 verarbeiten.
in der CMD-Line
<code type =plain>
echo off
for /l %i in (1 1 4) do echo abcabc
abc
abc
abc
(for /l %i in (1 1 4) do echo abc)|findstr /n "^"
1:
2:>echo abc
3:abc
4:
5:>echo abc
6:abc
7:
8:>echo abc
9:abc
10:
11:>echo abc
12:abc
(for /l %i in (1 1 4) do >nul echo abc)|findstr /n "^"
1:
2:>echo abc 1>nul
3:
4:>echo abc 1>nul
5:
6:>echo abc 1>nul
7:
8:>echo abc 1>nul
(for /l %i in (1 1 4) do @echo abc)|findstr /n "^"
1:abc
2:abc
3:abc
4:abc
das wären die 8 zuvielen Zeilen.
wenn die 9. zuviele Zeile wegsoll musst Du die Leerzeilen der Dateien entfernen
for %%i in (*.txt) do @more +1 "%%i"|findstr /v /r /c:"^[ ]*$"
Gruß Phil