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

Per batch gruppieren und zählen

Frage Entwicklung Batch & Shell

Mitglied: wemdas

wemdas (Level 1) - Jetzt verbinden

16.02.2010 um 10:57 Uhr, 3854 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
Datein zählen via Batch und Berechnen (1)

Frage von Anrion zum Thema Batch & Shell ...

Batch & Shell
gelöst Per Batch Datei die Zahl jede Zell in einer Spalte um 10 verkleinern (12)

Frage von ha5257 zum Thema Batch & Shell ...

Linux
gelöst Umlaute zählen - Bash-Script (5)

Frage von plutowitsch zum Thema Linux ...

JavaScript
Javascript rechnen mir sehr sehr großen Zahlen (3)

Frage von it4baer zum Thema JavaScript ...

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
Festplatten, SSD, Raid
gelöst Raid-Controller (Areca) Datenverlust trotz R5 (13)

Frage von sebastian2608 zum Thema Festplatten, SSD, Raid ...

Webentwicklung
Aktuellen Mitarbeiter auf Homepage anzeigen (13)

Frage von alemanne21 zum Thema Webentwicklung ...

Microsoft Office
gelöst Office 365 Pro Domäne einrichten OHNE Webseite (9)

Frage von thklemm zum Thema Microsoft Office ...

Voice over IP
48 Port VOIP Switch mit POE gesucht (8)

Frage von brutzler zum Thema Voice over IP ...