u0206084
Goto Top

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

Content-ID: 176757

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

Ausgedruckt am: 22.11.2024 um 07:11 Uhr

Skyemugen
Skyemugen 24.11.2011 um 11:00:27 Uhr
Goto Top
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 face-wink
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 face-wink read-only bedeutet ja, dass keine Verarbeitung stattfindet, ergo ist es wie es nicht gelesen zu haben
bastla
bastla 24.11.2011 um 11:02:52 Uhr
Goto Top
Hallo u0206084!

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  
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 findstr /n "^" vorzunehmen ... face-wink

[Edit] @skye: ... und ich hatte gedacht in den ignore-completely-mode ... face-wink [/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 ... face-wink
[/Edit2]
u0206084
u0206084 24.11.2011 um 13:05:26 Uhr
Goto Top
Hallo Andre

Versuche es mal ein wenig genauer zu erklären.

Es gibt ein Ordner nenne Ihn mal c:\Ablage\*.csv.
In diesem Ordner werden *.csv Dateien abgelegt (unbestimmte Anzahl)

Auszug aus dieser Datei:

15517482;53;09.11.2011;2011
449000;K;00;0000;512,92;790004;K;000;0000;512,92;OKT11 HHM EMM;
449100;K;00;0000;1009,86;790004;K;000;0000;1009,86;OKT11 HHM EMM;
449200;K;00;0000;57;790004;K;000;0000;57;OKT11 HHM EMM;
450000;K;00;0000;301962,49;790004;K;000;0000;301962,49;OKT11 HHM EMM;

!!Die erste Zeile ist sozusagen die Überschrift --> 15517482;53;09.11.2011;2011

Ich möchte jetzt die *.csv Dateien im im Verzeichnis c:\Ablage\ vorhanden sind in einer Datei neu.csv zusammenführen.
Hierbei sollte dann die Überschrift entfernt werden und durch die Gesamtanzahl an Zeilen der zusammengeführten *.csv Dateien anstatt der Überschrifft eingefügt werden.

Das zusammenführen habe ich hin bekommen so wie oben abgebildet zusätzlich habe ich ermitteln können wie viele Zeilen die neue *.CSV hat . !!

Jedoch konnte ich es noch nicht ermöglichen die überschrift durch die ermittelte Gesamtanzahl an Zeilen zu ersetzen.
Denke das wird mit Batch gar nicht zu realisieren sein.

Fall die in VBS besser zu realisieren ist wäre ich über etwas Unterstüzung sehr dankbar.
Ich hoffe ich konnte dies ein wenig besser erläutern wie zuvor.

Dank
pieh-ejdsch
pieh-ejdsch 24.11.2011 um 14:42:13 Uhr
Goto Top
moin,

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 ...)

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
u0206084
u0206084 24.11.2011 um 22:27:53 Uhr
Goto Top
Hallo Phil

super vielen Dank schein zu funktionieren, jetzt muss ich mich nur noch damit beschäftigen was all das genau bedeutet was du in deiner Batch geschrieben hast.

Vielen Dank noch mal für deine Hilfe.

Gruß Martin
bastla
bastla 24.11.2011 um 22:43:39 Uhr
Goto Top
Hallo u0206084!
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"  
)
verwendest ...

Zur Zeile 3 hätten wir übrigens sogar das passende Echo ohne Zeilenumbruch und ähnliche Spielereien im Angebot ...

Grüße
bastla
u0206084
u0206084 25.11.2011 um 08:30:25 Uhr
Goto Top
Hallo Phil,

vielen Dank für dein bisherige Hilfe.

Ich hätte da noch eine Frage, vielleicht fällt dir auch dazu was ein.

Ist es auch möglich den ermittelten Wert der Zeilenanzahl in der Überschrift auszutauschen ?

15517482;53;09.11.2011;2011

An der Position nach dem ersten Semicolon in der ersten Zeile hier steht momentan die 53 anstatt die 53 sollte der ermittelte Wert der Zeilenanzahl stehen.

Die Überschrift soll also genau so bleiben wie sie war jedoch nur durch den Austausch der beschriebenen Position.

Da es sich um mehre csv Dateien handelt und jede eine Überschrift hat, jedoch sich diese nur durch die Zeilenanzahl (pos2 der Überschrift) unterscheidet muss lediglich von allen zusammengeführten Dateien nur eine Überschrift behalten werden und die Zeilenanzahl auf der beschriebenen Position mit dem Aktuellen Wert (Zeilenanzahl ) in der Sammel.csv aktualisiert werden.

Vielen Dank für deine Unterstützung
pieh-ejdsch
pieh-ejdsch 25.11.2011 um 14:37:46 Uhr
Goto Top
moin Martin,

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"  
)
[Edit]
SET aus der FOR mit Verkettung entfernt
Edit]

Gruß Phil
u0206084
u0206084 25.11.2011 um 15:46:51 Uhr
Goto Top
Hallo Phil

leider funktioniert dies nicht

Meldung

"set" ist syntaktisch an dieser stelle nicht verarbeitbar


Ergebnisdatei sammel.csv wird erstellt. (Auszug siehe unten)

0
449000 K 0 0 512,92 790004 K 0 0 512,92 OKT11 HHM EMM
449100 K 0 0 1009,86 790004 K 0 0 1009,86 OKT11 HHM EMM
449200 K 0 0 57 790004 K 0 0 57 OKT11 HHM EMM


Danke
pieh-ejdsch
pieh-ejdsch 25.11.2011 um 22:30:24 Uhr
Goto Top
Ähm ja da Verträgt sich eine Eingabe mit einer Befehlsverkettung (vom FIND) nicht.
Lässt sich also doch nur setperat nutzen.

Ich habs Oben berichtigt.

Gruß Phil
u0206084
u0206084 28.11.2011 um 08:26:47 Uhr
Goto Top
Hallo Phil,

das Script funktioniert so weit, jedoch stimmt die Zeilenanzahl nicht

Hier im Test hatte ich 4 textdateien mit jeweils 4 Zeilen (ink. Überschrift)

das Ergebnis war dies

15517482 21 09.11.2011 2011
449000 K 0 0 512,92 790004 K 0 0 512,92 OKT11 HHM EMM
449000 K 0 0 512,92 790004 K 0 0 512,92 OKT11 HHM EMM
449100 K 0 0 1009,86 790004 K 0 0 1009,86 OKT11 HHM EMM
431000 K 0 0 3735,54 790004 K 0 0 3735,54 JUL11 HM EMM
431100 K 0 0 2311,01 790004 K 0 0 2311,01 JUL11 HM EMM
431200 K 0 0 2836,1 790004 K 0 0 2836,1 JUL11 HM EMM

563000 K 0 0 56324,6 790004 K 0 0 56324,6 JUL11 HKP EMM
563100 K 0 0 18929,14 790004 K 0 0 18929,14 JUL11 HKP EMM
563200 K 0 0 53428,35 790004 K 0 0 53428,35 JUL11 HKP EMM
400000 P 0 0 18770,4 790004 K 0 0 18770,4 JUL11 PV EMM
401000 P 0 0 25447,61 790004 K 0 0 25447,61 JUL11 PV EMM
402000 P 0 0 20168,44 790004 K 0 0 20168,44 JUL11 PV EMM


Also 21

von den 4 Textdateien darf ja im neuen Sammel.csv nur eine angezeigt werden mit den aktuellen Zeilen.
Hier muss irgendwo noch falsch gezählt werden.

Aber bis hier hin passt schon mal.

Fall du noch Zeit hast kannst ja nochmal darüber schauen.

Danke für deine Mühe.
pieh-ejdsch
pieh-ejdsch 28.11.2011 um 15:24:02 Uhr
Goto Top
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>
echo off
for /l %i in (1 1 4) do echo abc
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
  for %%i in (*.txt) do @more +1 "%%i"|findstr /v /r /c:"^[	 ]*$"   

Gruß Phil
u0206084
u0206084 28.11.2011 um 21:03:20 Uhr
Goto Top
Hallo Phil

ich probiere es mal aus danke für deine Hilfe.
Ist es denn auch möglich automatisiert leerzeilen zu löschen falls vorhanden ?

Gruß Martin
u0206084
u0206084 29.11.2011 um 08:03:12 Uhr
Goto Top
Hallo Phil,

habe deine Anmerkung mit der Leerzeile übersehen. An was für einer Position im Script muss ich diese den genau platzieren.

Gruß Martin
u0206084
u0206084 29.11.2011 um 08:08:46 Uhr
Goto Top
Hallo Phil

hier das Ergebnis nach der Anpassung des @

15517482 13 09.11.2011 2011
449000 K 0 0 512,92 790004 K 0 0 512,92 OKT11 HHM EMM
449000 K 0 0 512,92 790004 K 0 0 512,92 OKT11 HHM EMM
449100 K 0 0 1009,86 790004 K 0 0 1009,86 OKT11 HHM EMM
431000 K 0 0 3735,54 790004 K 0 0 3735,54 JUL11 HM EMM
431100 K 0 0 2311,01 790004 K 0 0 2311,01 JUL11 HM EMM
431200 K 0 0 2836,1 790004 K 0 0 2836,1 JUL11 HM EMM

563000 K 0 0 56324,6 790004 K 0 0 56324,6 JUL11 HKP EMM
563100 K 0 0 18929,14 790004 K 0 0 18929,14 JUL11 HKP EMM
563200 K 0 0 53428,35 790004 K 0 0 53428,35 JUL11 HKP EMM
400000 P 0 0 18770,4 790004 K 0 0 18770,4 JUL11 PV EMM
401000 P 0 0 25447,61 790004 K 0 0 25447,61 JUL11 PV EMM
402000 P 0 0 20168,44 790004 K 0 0 20168,44 JUL11 PV EMM


Die leerzeile müsste ich noch weg haben, und dann die Zahl Zeilen um diese Leerzeile subtrahieren, bzw. gar nicht mit zählen.


Gruß Martin
pieh-ejdsch
pieh-ejdsch 29.11.2011 um 11:41:32 Uhr
Goto Top
moin Martin,

mit dem Batch im Editor drückst Du [strg]+H
in die obere Zeile kommt:
more +1 "%%i"
in die untere Zeile kommt:
more +1 "%%i"|findstr /v /r /c:"^[	 ]*$"
-> (Alle Ersetzen)

speichern ... Fertig - somit wird richtig Gezählt und Richtig erstellt.

Gruß Phil
u0206084
u0206084 29.11.2011 um 12:05:09 Uhr
Goto Top
Hallo Phil,

super vielen Dank funktioniert.

Danke dir für deine Geduld face-smile Progammieren ist leider nicht so meine Leidenschaft.

Versuche mich jedoch Stück für Stück darin einzuarbeiten.

Also Danke nochmals für deine tolle unterstützung.