Top-Themen

Aktuelle Themen (A bis Z)

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 Per batch gruppieren und zählen

Mitglied: wemdas

wemdas (Level 1) - Jetzt verbinden

16.02.2010 um 10:57 Uhr, 3889 Aufrufe, 7 Kommentare

Hallo zusammen,

ein Lob an dieses Forum, hab' mir bisher schon sehr viele Informationen aus diesem Forum gezogen.
Nun habe ich allerdings ein Problem, bei dem ich noch nicht weitergekommen bin.

Meine bisherigen Versuche, leider erfolglos:

@echo off & setlocal
set /a ANZ=0
for /f %%i in ('findstr /G:c:\eze\Anz_Ger2.txt C:\eze\Anz_Ger3.txt') do set /a ANZ+=1
echo %ANZ%
pause


oder


@echo off & setlocal
for /f "tokens=3" %%l in ('find /C " " C:\eze\Anz_Ger3.txt') do set ANZ=%%l
echo %ANZ%
pause



So sieht meine Eingangsgröße aus
(Datei "c:\eze\Anz_Ger3.txt", die aber jeden Tag eine andere Anzahl von 0501, 0502, ... liefern kann und auch nicht jeden Tag immer 0501, 0502 und 1502 hat - manchmal fehlt z.B. 1502):
0501
0501
0501
0502
0502
1502
1502
1502
1502

Nun soll als Ergebnis erscheinen:
0501 Anzahl: 3
0502 Anzahl: 2
1502 Anzahl: 4


Danke schon mal an die Mitglieder dieses Foruums. Schön, dass es so etwas gibt.
Mitglied: wemdas
16.02.2010 um 11:33 Uhr
sortieren muss nicht unbedingt sein, vielmehr gruppieren oder zusammenfassen
Bitte warten ..
Mitglied: bastla
16.02.2010 um 14:29 Uhr
Hallo wemdas!

Etwa so:
01.
@echo off & setlocal 
02.
set "Ein=D:\Daten.txt" 
03.
set "Aus=D:\Auswertung.txt" 
04.
 
05.
type nul>"%Aus%" 
06.
for /f "usebackq delims=" %%i in ("%Ein%") do ( 
07.
    findstr /b /c:"%%i Anzahl:" "%Aus%">nul||(for /f %%a in ('find /c "%%i" ^<"%Ein%"') do >>"%Aus%" echo %%i Anzahl: %%a) 
08.
)
[Edit] Parameter "/b" nachgereicht (falls nicht alle Werte die selbe Stellenanzahl haben sollten) [/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: wemdas
17.02.2010 um 20:20 Uhr
Hallo bastla,

hervorragend, hat auf Anhieb funktioniert.
Großes Kompliment, schönen Abend und Danke.


Gruß
wemdas
Bitte warten ..
Mitglied: Biber
17.02.2010 um 21:00 Uhr
Moin wemdas,

noch mal der Vollständigkeit halber...

bastlas Schnipsel ist ein funktionierender Ansatz speziell für den Fall, dass die Daten unsortiert vorliegen.
Allerdings hat die Kürze des Codes und die universelle Einsetzbarkeit unter Umständen einen Nachteil..
Für jede gatesverdammte Zeile in der Eingabedatei müssen zwei externe Programme aufgerufen werde (Find.exe und FindStr.exe).
Und 100000 Zeilen mit einem FOR/F-Konstrukt durchwackelt werden, wenn denn 100000 zeilen drin wären in der Ein-Datei.

Die klassische Mimik der Gruppenverarbeitung würde ja anders ansetzen, nämlich
a) falls nicht ohnehin gegeben, sicherstellen, dass die zu lesende Datei nach Gruppenwechsel-Begriffen sortiert ist (so wie in deiner Darstellung ganz oben)
b) alle 100000 Zeilen durchwackeln meinetwegen mit einer FOR/F-Anweisung
c) bei jedem Gruppenwechsel das Zwischenergebnis dieser Gruppe rausschreiben.

FALLS also deine Ein-Liste sortiert vorliegen sollte, dann sollte es so konservativer, aber flotter gehen:
01.
@echo off & setlocal 
02.
 
03.
Set /p ThisOne=<wemdas.txt 
04.
echo Start %thisOne% 
05.
Set /a CountNow=0 
06.
For /F %%i in (Wemdas.txt) do call:countItem %%i 
07.
 
08.
:CountItem 
09.
If "%thisOne%" == "%1" Set /a "CountNow+=1" & goto :eof 
10.
 
11.
If %countNow% GTR 0 ( 
12.
   Echo %ThisOne% Anzahl %CountNow% 
13.
   Set /a "CountNow=1" 
14.
   Set "ThisOne=%1"   
15.
) 
[hier im Beispiel unterstellt: eine Ein-Datei namens "wemdas.txt", sortiert, im aktuellen Verzeichnis; Ergebnis auf dem Monitor]

Ginge also auch ohne 2x 100000 zusätzliche Find/FindStr-Aufrufe.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
17.02.2010 um 23:20 Uhr
@Biber
Deine Einwände sind natürlich völlig richtig - ein Detail wäre allerdings zu korrigieren:
Für jede gatesverdammte Zeile in der Eingabedatei müssen zwei externe Programme aufgerufen werde (Find.exe und FindStr.exe).
"Findstr.exe" wird tatsächlich für jede einzelne Zeile benötigt, "Find.exe" allerdings für jeden vorkommenden Wert nur einmal (aber natürlich immer noch oft genug ) ...

Nixdestotrotz ist es (bei entsprechend großer Zeilenanzahl) wahrscheinlich auch für unsortierte Daten effizienter, eine sortierte Temp-Datei zu erzeugen und diese auf die von Dir beschriebene Art auszuwerten.

Wäre übrigens eine Schleife mit "delayedExpansion" (und damit ohne Notwendigkeit des Unterprogrammaufrufes) noch schneller?

Grüße
bastla

P.S.: Bei "Gruppenverarbeitung" werde ich ein wenig nostalgisch - derartiges hab' ich erstmals in meinen BASIC-Anfängen 1979 auf einer PDP-8 geschrieben (und auf Lochstreifen gespeichert) ...
Bitte warten ..
Mitglied: Biber
18.02.2010 um 08:41 Uhr
Moin bastla,

Zitat von bastla:
Wäre übrigens eine Schleife mit "delayedExpansion" (und damit ohne Notwendigkeit des Unterprogrammaufrufes) noch schneller?
Ja nee.... da gibt es ein Detail in dem oben skizzierten Prozessablauf, auf den ich eigentlich gar nicht besonders eingehen wollte und den ich ohne Unterprogrammaufruf gar nicht so unauffällig hinbekommen hätte.

Di Krux liegt ja im Erkennen des Gruppenwechsels.. ein Gruppenwechsel in oben beschriebenen Sinn wird erkannt, wenn sich der neue Gruppenbegriff unterscheidet vom zuletzt "gemerkten (die Variable %thisOne% in der Skizze.
Dann wird, bei einem neuen %thisOne%, eine Summenzeile für das bisherige %thisOne& geschrieben.
Guter Plan, allerdings würde das für den letzten Gruppenwechselbegriff KEIN Gruppenwechselbegriff "gemerkt".

Diese kleine Klippe umgehe ich dadurch, dass (ganz unauffällig, wie ich hoffte) zwischen Zeile 06 und Zeile 08 am Ende des eigentlichen Batches und vor Beginn des "Unterprogramms" ein "goto :eof" fehlt.
In diesem Fall bewusst - nach dem Ende des Hauptbatches werden noch einmal mehr die Codezeilen durchlaufen, die eigentlich das Unterprogramm ":CountItem" darstellen.

Wie geschrieben... diese krumme Programmierung bekomme ich ohne CALL-Aufruf und mit DelayedExpansion nicht so unauffällig hin...

P.S.: Bei "Gruppenverarbeitung" werde ich ein wenig nostalgisch - derartiges hab' ich ertmals in meinen
BASIC-Anfängen 1979 auf einer PDP-8 geschrieben (und auf Lochstreifen gespeichert) ...
Ja, auch ich kenne sowas auch noch in COBOL-Syntax und mit HOST-Steuerkarten...

Grüße
Biber
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
In Batch Zählen
gelöst Frage von mavericklpBatch & Shell2 Kommentare

Guten Morgen zusammen, Ich habe ein kleines Problem mit einer Zählschleifer in der Batch Datei. Und zwar werden die ...

Batch & Shell
Zahlen in Batch addieren...
gelöst Frage von Hans87Batch & Shell2 Kommentare

Hallo, ich habe ein batch skript geschrieben, das zwei SQL Abfragen ausführt. Beide geben Werte zurück. Die zurückgegebenen Werte ...

Batch & Shell

Zahlen aus Textdatei in Batch vergleichen

gelöst Frage von yspke24Batch & Shell7 Kommentare

Hi, ich habe schon stundenlang im Internet gesucht, konnte aber nichts Passendes finden. Ich habe eine Textdatei "time.log". In ...

Batch & Shell

Zahlen in Batch auseinander schreiben

gelöst Frage von PanubuBatch & Shell6 Kommentare

Hallo zusammen, ich habe folgendes in Batch geschrieben: Das Ergebnis, wenn ich bspw. 1234 eingebe soll so aussehen: A1d2m3i4n ...

Neue Wissensbeiträge
Microsoft
ARD-Doku - Das Microsoft Dilemma
Tipp von Knorkator vor 27 MinutenMicrosoft

Hallo zusammen, vor einigen Tagen lief in der ARD u.a. Reportage. Das Youtube Video dazu dürfte länger verfügbar sein. ...

Windows 10

Neue Sicherheitslücke in Windows 10 (Version 1709) durch Google öffentlich geworden

Information von kgborn vor 18 StundenWindows 10

Vor ein paar Tagen haben Googles Sicherheitsforscher vom Projekt Zero eine Sicherheitslücke im Edge-Browser publiziert. Jetzt wurde eine weitere ...

iOS
IOS 11.2.6 verfügbar
Information von sabines vor 1 TagiOS

Mit dem Update soll der Bug behoben werden, bei dem eine bestimmte Zeichenkette IOS zum Absturz gebracht hat.

Sicherheit
Sicherheitsrisiko: Die Krux mit 7-Zip
Information von kgborn vor 1 TagSicherheit8 Kommentare

Bei vielen Anwendern ist das Tool 7-Zip zum Entpacken von Archivdateien im Einsatz. Die Software ist kostenlos und steht ...

Heiß diskutierte Inhalte
Router & Routing
LANCOM VPN CLIENT einrichten
Frage von Finchen961988Router & Routing27 Kommentare

Hallo, ich habe ein Problem und hoffe ihr könnt mir helfen, wir haben einen Kunden der hat einen Speedport ...

Windows Server
AD DS findet Domäne nicht, behebbar?
Frage von schapitzWindows Server25 Kommentare

Guten Tag, ich habe bei einem Kunden ein Problem mit den AD DS. Umgebung ist folgende: Windows Server 2016 ...

LAN, WAN, Wireless
VPN Cisco ASA5505 PaloAlto PA-200
gelöst Frage von YannoschLAN, WAN, Wireless22 Kommentare

Hallo zusammen, ich würde gerne ein Site-to-Site VPN zwischen den beiden Standorten aufbauen. PaloAlto PA200 Internetanschluss Deutsche Telekom GK ...

SAN, NAS, DAS
Qnap TS-453S Pro - Anbindung Active Directory
Frage von JuckieSAN, NAS, DAS13 Kommentare

Hallo zusammen, ich habe hier eine Qnap TS-453S Pro die sich mal so absolut gar nicht in das Active ...