Wörter Zählen
Michael W.
- php
0 lulu0 Michael W.0 lulu0 Michael W.0 lulu
0 Wörter zählen
Sönke Tesch
Hallo,
um es euch zu vereinfachen euch in das problem rein zu denken, versuche ich jetzt mal mein situation genau zu beschreiben:
ich arbeite jetzt in einer firma die ein riesieges netzwerk hat
von frankfurt bis Kölle und weiter, insgesamt 300 aussenstellen und alle sind sie miteinander verbunden.
jeder PC der an diesem netzwerk hängt muss sich mit seinem usernamen anmelden. darauf folgt ein logon-script in dem eine hardwareerkennung durchläuft. diese hardware erkennung wird in einem bestimmten pfad als %user%.log (wenn der user Michael heisst dann heisst die datei logischer weisse michael.log) abgespeichert.
in frankfurt ist der hauptsitz der administratoren die jetzt wissen wollen wieviele pentium und amd athlon in allen 300 aussenstellen stehen. Das Heisst man soll bequem über das admin menü einzelen user einzelne Server und auch das komplette netz auslesen können.
das passiert mit einem shell script (...), so gelangen die einzelnen dateien in frankfurt
jetzt kommt php an die reihe:
zunächst einmal ist das schwirigste alle dateien in eine datei zu bekommen.
sprich im ordner /user befinden sich dann alle %user%.log (es gibt kein doppelt !!)
"user1.log"
"user2.log"
"user3.log"
sollen alle in "gesamtauswertung.log"
das ist punkt 1:
wie schreibe ich mehrere dateien in eine datei (hintereinander) ??
punkt 2:
ich zeige euch jetzt mal den wichtigsten abschnitt der datei, die ensteht wenn sich die einzelenen user anmelden:
PROCESSOR----------------------------------------------------------------------
Model: AT clone
Processor: Intel Pentium with MMX-167
CPU Vendor ID: GenuineIntel
CPU Family Level: 5
CPU Model Level: 4
CPU Stepping Level: 3
Enhanced Virtual Mode: Yes
Pentium Style registers: Yes
Machine Check Exception: Yes
CMPXCHG8B instruction: Yes
MMX (MultiMedia eXt): Yes
Pentium FDIV bug: No
Coprocessor: Internal
Extended BIOS data area: Yes, at 9F80 (638k)
DMA Channel 3 used: No
Slave 8259 Present: Yes
Real Time Clock: Yes
I/O Bus Type: PCI (ver 2.16)
Davon wiederum ist der wichtigste punkt:
Processor: Intel Pentium with MMX-167
wenn ich jetzt (und jetzt kommen wir zum problem und zum grund der geschcihte) nach Pentium suche dann findet das script schonmal 2 wörter (mehr aber auch nicht):
Processor: Intel Pentium with MMX-167
Pentium Style registers: Yes
also müssen wir vor dem zählen der pentiums, erstmal die zeilen suchen die "Processor:" beinhalten und da ist es sehr sehr schlecht das es einen "Coprocessor:" gibt...
Ich habe hier ein script, dass mir zeilen raussucht:
<?php
$a = "Processor:";
$datei = file('report.log');
for($i=0;$i<count($datei);$i++)
{
if(eregi($a,$datei[$i])) $gz1 = $datei[$i];
}
?>
Das script findet aber immer nur das letzte wort in der .log file- d.h. Coprocessor ...
und ausserdem heisst das dann auch wenn ich mehrere processoren in der text-datei stehen hab, dass mir nur die letzte ausgegeben wird.
aber ich will doch eine auflistung aller prozessoren haben.
Punkt 2 ist also:
welches php script macht mir eine auflistung über mehrere worte hinweg. d.h.
meine text.txt:
das ist zeile1 mit begriff1
das ist zeile2 mit begriff2
das ist zeiel3 mit begriff1
das script soll mir alle zeilen geordnet ausgeben:
das ist zeiel1 mit begriff1
das ist zeiel3 mit begriff1
das ist zeile2 mit begriff2
so und jetzt kommen wir zum letzten punkt:
ein 3. script (was am ende alles in eins rein soll), soll mir zählen wie oft begriff1 jetzt vorkommt:
dann steht da am ende
anzahl Überbegriff
2 Begriff1
1 Begriff2
.
.
.
und jetzt nochmal alle punkte:
punkt1:
mehrere txt oder .log dateien in eine gesamt.log datei zu schreiben.
punkt2:
ein script, dass mir beliebige begriffe einzelner zeilen sucht und geoordnet ausgibt (ausgabe kann man ja dann mit echo varieren)
punkt3:
der wortzähler der mir die anzahl eines beliebigen wortes in einer variablen speichert ($anzahl_a , $a =begriffa) ...
Ich hoffe sehr dass ich meine problem nicht zu knapp geschildert habe und dass ihr mir helfen könnt.
Huhu Michael
evtl. wäre es eine Alternative die Daten aus den txt-Files
in eine Datenbank zu importieren.
Dann hast Du es mit Zählaufgaben und Auswertungen leichter, da Du
diese direkt in SQL formulieren kannst.
Die Projektbeschreibung hört sich zumindest so an als ob da noch weitere Wünsche, was die Auswertung angeht, nachkommen werden ...
so far ...
lulu
wenn ich wüsste wie das geht !!?
Huhu Michael
wenn ich wüsste wie das geht !!?
wann soll/muss es denn fertig sein?
Wie viele Dateien sind es denn?
Du sagtest etwas von 300 Filialen.
Multipliziert mit im Schnitt x PCs.
Viele Grüße
lulu
wann soll/muss es denn fertig sein?
das müsste schon diese woche passieren, obwohl mein ausbilder das ganze aber jetzt selber in die hand nehmen will.
Wie viele Dateien sind es denn?
Du sagtest etwas von 300 Filialen.
Multipliziert mit im Schnitt je 2 - 70 PCs.
kommt halt ganz drauf an ...
aber da gäbe es ein shell script das dann alle daten von allen servern runteholt und in frankfurt in einen ordner je user eine datei schreibt.
Moin Michael
das müsste schon diese woche passieren, obwohl mein ausbilder das ganze aber jetzt selber in die hand nehmen will.
demnach hat sich das Problem für Dich also erledigt, oder?
Viele Grüße
lulu
punkt1:
mehrere txt oder .log dateien in eine gesamt.log datei zu schreiben.
Funktionen zum Auslesen des Verzeichnisinhalts findest Du in der PHP-Anleitung unter "Directory Funtions", Funktionen zum Einlesen von bzw. Ausgeben in Dateien unter "Filesystem Functions".
punkt2:
ein script, dass mir beliebige begriffe einzelner zeilen sucht und geoordnet ausgibt (ausgabe kann man ja dann mit echo varieren)
Wenn Du nach Zeilen suchst, die so
Processor: Intel Pentium with MMX-167
aussehen, dann könntest Du beispielsweise erst die Leerzeichen vorne entfernen, dann prüfen, ob der erste Teil der Zeichenkette "Processor: " lautet und falls ja, den Rest der Zeile speichern.
Diese zwei benötigten Funktionen findest Du im Kapitel "String Functions".
Nicht unbedingt besser, aber immer ganz fürchterlich besonders professionell sieht's aus, wenn Du reguläre Ausdrücke benutzt. Der müsste dann ungefähr lauten " *Processor: +(.*)", sprich: Null oder mehr Leerzeichen, das Wort "Processor:", ein oder mehr Leerzeichen und last but not least in Klammern (damit's ausgegeben wird) der Rest der Zeichenkette. Keine Ahnung ob's so funktioniert und man kann es natürlich auch noch verfeinern mit \s oder ähnlichem, bin aber jetzt zu faul, das rauszusuchen.
Diese Funktion findest im Kapitel "Regular Expression Functions (Perl-Compatible)".
punkt3:
der wortzähler der mir die anzahl eines beliebigen wortes in einer variablen speichert ($anzahl_a , $a =begriffa) ...
Felder haben in PHP die nützliche Eigenschaft, statt Zahlen auch Zeichenketten als Index verwenden zu können. Zum Vorkommen-zählen kannst Du also einfach etwas in dieser Richtung benutzen:
$processor=funktion_die_den_prozessor_ausgelesen_hat();
$zaehl_mir_mal[$processor]++;
Am Ende der Prozedur solltest Du dann ein solches Feld haben:
$zaehl_mir_mal["Intel Pentium with MMX-167"]=23;
$zaehl_mir_mal["AMD Athlon Tralala"]=42;
$zaehl_mir_mal["PIC16C72"]=4578996421245;
Alles ohne Anspruch auf Vollständigkeit oder Richtigkeit und nur als Denkanstoß gedacht.
Schönen Tag,
soenk.e
du hast mich auf ne idde gebracht: wenn man die leerzeichen mitsucht bekommt man nur ein ergebniss.
ich finde die php dokumentationen total schlecht gemacht, obwohl die übersicht in ordnung ist. ich raff aber nie wie ich das meinen problemen anpassen kann ...
kannst du mal schauen wie so ein script in etwa aussieht dass ich am ende halt im script nur die gesamt.log angebe und eben nach der suche nach den verschiedenen prozessoren die einzelnen prozessoren gezählt werden ...
Danke