wie kann ich unter Word einzelne Buchstaben eines Textes zählen?
mein Dank schonmal im voraus
Mustafa
>wie kann ich unter Word einzelne Buchstaben eines Textes zählen?
Bei ord 97 und Word 2000 findest du diese Information in Datei >
Eigenschaften > Statistik.
--
(tm)
Du speicherst den Text als *.txt-Datei. Deren Länge in Byte ist dann
die Zahl der Buchstaben ...
Oder willst Du die a, b, c ... einzeln zaehlen? Dann brauchst Du ein
Script/Makro.
Gruss: Lothar Seiffert
PS: Wozu muss man die Zahl de Buchstaben wissen?
> Oder willst Du die a, b, c ... einzeln zaehlen? Dann brauchst Du ein
> Script/Makro.
Genau das will ich wissen. Habe aber keine Ahnung von Makros unter Word..
> PS: Wozu muss man die Zahl de Buchstaben wissen?
Brauche ich um die Häufigkeitsverteilung der Buchstaben in der deutschen
Sprache zu ermitteln.
Sie ist ziemlich genau:
e n i s r a t d h u l g m o b w f k z ...
17,7 9,8 7,6 7,3 7,0 6,5 6,2 5,1 4,8 4,4 3,4 3,0 2,5 2,5 1,9 1,9 1,7 1,2 1,1 <0,01
Siehe:
http://cruncher.ba-mannheim.de/~972870/krypanal.htm
http://www.uni-karlsruhe.de/~za220/htm/kurse/mag/aufgabe1.htm
Gruss: Lothar Seiffert
ist zwar ganz nett, daß du mir die Arbeit erleichterst, nur _muß_ ich die
Verteilung anhand eines Textes
selbst bestimmen..
Trotzdem danke für die nützlichen links.
Mustafa
"Lothar Seiffert" <seif...@fh-furtwangen.de> schrieb im Newsbeitrag
news:391A9469...@fh-furtwangen.de...
Muss es ein Word-Dokument sein? Wenn Du den Text als ASCII speichern kannst,
was ja zum Buchstabenzaehlen ausreicht, kannst Du ein primitives Programm
selber schreiben. Idee: Die letzten 5 Bit des Buchstaben abschneiden und als
Index in eine Tabelle mit den Zaehlwerten nehmen.
Gruss: Lothar Seiffert
Habe soeben ein Quick'n'Dirty-Programm zum Zählen geschrieben. Es produziert
folgenden Output (für ein deutsches Wörterbuch):
M:\TURBO>buchzahl deutsch.txt
Zählt die Buchstaben einer Text-Datei. (c) 2000 Lothar Seiffert
Ausgewertet wurden 2048288 Buchstaben:
a: 5.1% 104552x k: 1.9% 39507x u: 3.5% 71498x
b: 2.3% 48085x l: 4.3% 87930x v: 0.9% 19212x
c: 3.0% 61027x m: 2.5% 50479x w: 1.1% 22934x
d: 2.8% 56720x n: 8.8% 180196x x: 0.1% 1275x
e: 17.6% 360282x o: 2.2% 44316x y: 0.1% 1627x
f: 2.1% 42672x p: 1.4% 27843x z: 1.2% 25273x
g: 4.0% 81331x q: 0.0% 807x ä: 0.8% 16780x
h: 4.3% 87329x r: 8.1% 166415x ö: 0.3% 5743x
i: 5.9% 120116x s: 7.6% 156681x ü: 0.8% 15397x
j: 0.1% 1736x t: 7.3% 150525x ß: 0.0% 0x
Leerzeichen: 0 Sonstige Zeichen: 174734
Das Programm sieht so aus:
Program BuchstabeZahl;
Var Block : Array [1..1024] of Byte;
Buch : Array [0..31] of Char;
Zahl : Array [0..31] of LongInt;
Proz : Array [0..31] of Real;
Summe : LongInt;
Rest : Integer;
I : Integer;
Datei : File;
{ Initialisiert Buchstaben }
Procedure BuchInit;
Var I:Integer;
Begin
For I:=1 to 26 do Buch[I]:=Char(I+96);
Buch[00]:='*'; Buch[27]:='ä'; Buch[28]:='ö';
Buch[29]:='ü'; Buch[30]:='ß'; Buch[31]:='§';
End;
{ Initialisiert Zahlen }
Procedure ZahlInit;
Var I:Integer;
Begin
For I:=1 to 30 do Zahl[I]:=0;
End;
{ Zählt Buchstaben }
Procedure BuchZahl(E:Integer);
Var I,W:Integer;
Begin
For I:=1 to E do
Case Block[I] of
$41..$5A : Inc(Zahl[Block[I]and$1F]);
$61..$7A : Inc(Zahl[Block[I]and$1F]);
$C4,$8E,$E4,$84 : Inc(Zahl[27]);
$D6,$99,$F6,$94 : Inc(Zahl[28]);
$DC,$9A,$FC,$81 : Inc(Zahl[29]);
$DF,$E1 : Inc(Zahl[30]);
$20 : Inc(Zahl[31]);
else Inc(Zahl[00]);
End;
End;
{ Berechnet Prozente }
Function Prozente:LongInt;
Var I:Integer; S:Longint;
Begin
S:=0;
For I:=1 to 30 do S:=S+Zahl[I];
If S=0 then Exit;
For I:=1 to 30 do Proz[I]:=Zahl[I]*100/S;
Prozente:=S;
End;
Begin
Writeln('Zählt die Buchstaben einer Text-Datei. (c) 2000 Lothar Seiffert');
Writeln;
If ParamStr(1)='' then Begin Writeln('Dateinamen eingeben!'); Exit; End;
BuchInit;
ZahlInit;
FileMode:=0;
Assign(Datei,ParamStr(1));
Reset(Datei,1);
If IOresult<>0 then Begin Writeln('Lesefehler!'); Exit; End;
While not Eof(Datei) do Begin
If IOresult<>0 then Begin Writeln('Lesefehler!'); Exit; End;
BlockRead(Datei,Block,1024,Rest);
BuchZahl(Rest);
End;
Summe:=Prozente;
Writeln('Ausgewertet wurden ',Summe,' Buchstaben:');
For I:=1 to 10 do Writeln(' ',Buch[I+00],': ',Proz[I+00]:4:1,'% ',Zahl[I+00]:6,'x',
' ',Buch[I+10],': ',Proz[I+10]:4:1,'% ',Zahl[I+10]:6,'x',
' ',Buch[I+20],': ',Proz[I+20]:4:1,'% ',Zahl[I+20]:6,'x');
Writeln('Leerzeichen: ',Zahl[31],' Sonstige Zeichen: ',Zahl[0]);
End.
Ist es das, was Du suchst?
Gruss: Lothar Seiffert
Behelfsmäßig, ohne Programmieraufwand:
Öffne den Text in Word, gehe auf BEARBEITEN und ERSETZEN. Suche nach a,
ersetze durch a. Rückmeldung: XX Ersetzungen wurden vorgenommen.
Aufschreiben. BEARBEITEN und ERSETZEN, Suche nach b, ersetze durch b. Das
ganze einmal quer durchs Alfabet. Groß/Klein ist egal, beide werden
berücksichtigt.
Gruß,
Gernot
Mittlerweile habe ich mir mal angeguckt wie die Makros funktionieren und
auch ein Makro für mein Problem geschrieben.
Das Problem ist nur noch, daß bei sehr langen Texten das Makro astronomisch
viel Zeit braucht, aber wenn ich den Text Seite für Seite durchsuche klappt
es prima.
Also mein großes Dank für die Mühe..
Hier mein Makro, wenn du es ausprobieren willst kannst du es einfach
kopieren und im Visual Basic Editor einfügen. Du müßtest vorher nur ein
leeres Dokument mit dem Namen "Ergebnis.doc" erstellen und in "Eigene
Dateien" abspeichern.
Sub Anzahl_Buchstaben()
'
' Anzahl_Buchstaben Makro
' Makro aufgezeichnet am 12.05.2000 von Mustafa'
Dim Buchstaben(65 To 90) 'Feld mit 26 Ziffern für A-Z (65 bis 90 sind die
ASCII Werte)
For i = 65 To 90
Buchstaben(i) = 0
Next i
anzahl = ActiveDocument.Characters.Count 'Alle Zeichen im Dokument werden
gezählt
Gesamtanzahl = 0 'Problem: Auch
Leerzeichen sind mitgezählt
For i = 1 To anzahl 'Hier werden dann
die Leerzeichen rausgenommen
If (Asc(ActiveDocument.Characters(i)) >= 65 And
Asc(ActiveDocument.Characters(i)) <= 90) Or
(Asc(ActiveDocument.Characters(i)) >= 97 And
Asc(ActiveDocument.Characters(i)) <= 122) Then
Gesamtanzahl = Gesamtanzahl + 1
End If
Next i
For i = 1 To anzahl
For A = 65 To 90 'Jedes Zeichen wird nach Buchstaben
untersucht
If Chr(A) = ActiveDocument.Characters(i) Or Chr(A + 32) =
ActiveDocument.Characters(i) Then
Buchstaben(A) = Buchstaben(A) + 1 'Das entsprechende Feld
wird um eins erhöht
End If
Next A
Next i
' Hier erfolgt die Auswertung, Achtung: Pfad
entsprechend umändern
Documents.Open FileName:="C:\Eigene Dateien\Ergebnis.doc",
ConfirmConversions:=False, _
ReadOnly:=False, AddToRecentFiles:=False, PasswordDocument:="", _
PasswordTemplate:="", Revert:=False, WritePasswordDocument:="", _
WritePasswordTemplate:="", Format:=wdOpenFormatAuto
Selection.TypeParagraph
Selection.TypeText Text:="HÄUFIGKEITSVERTEILUNG"
Selection.TypeParagraph
Selection.TypeParagraph
For i = 65 To 90
Selection.TypeText Text:=Chr(i) & ": " & Buchstaben(i) & " = " &
(Buchstaben(i) / Gesamtanzahl) * 100 & "%"
Selection.TypeParagraph
Next i
Selection.TypeParagraph
Selection.TypeText Text:="Gesamtanzahl der Buchstaben: " & Gesamtanzahl
End Sub
> Behelfsmäßig, ohne Programmieraufwand:
> Öffne den Text in Word, gehe auf BEARBEITEN und ERSETZEN. Suche nach a,
> ersetze durch a. Rückmeldung: XX Ersetzungen wurden vorgenommen.
> Aufschreiben. BEARBEITEN und ERSETZEN, Suche nach b, ersetze durch b. Das
> ganze einmal quer durchs Alfabet. Groß/Klein ist egal, beide werden
> berücksichtigt.
Hey coole Idee, danke dir!
Gerne doch ;-) Würde gerne wissen, wie Du es letztendlich gemacht hast...
Gernot
> Gerne doch ;-) Würde gerne wissen, wie Du es letztendlich gemacht hast...
>
Ich habe es genau so gemacht, wie du es beschrieben hast. Mit meinem Makro
funktioniert das zwar auch, aber das
würde einfach viel zu lange dauern, aber habe natürlich trotzdem behauptet
ich hätte es mit dem Makro gemacht :-)
Mustafa
Häh? Mein Turbo-Pascal-Programm schafft etwa 2 MByte Text pro Sekunde ...
Gruss: Lothar Seiffert
> Das Problem ist nur noch, daß bei sehr langen Texten das Makro astronomisch
> viel Zeit braucht, aber wenn ich den Text Seite für Seite durchsuche klappt
> es prima.
Also, ich kenne mich mit Word-Makros kein bißchen aus, aber hier sehe
ich doch mal ganz deutlich eine riesige Optimierungsmöglichkeit...
Und zwar läßt Du erstmal die Zählung der Gesamtanzahl weg (einfach
löschen). Dann ersetzt Du die FOR-Schleife durch folgendes:
FOR i = 1 TO Anzahl
Zeich = Asc(ActiveDocument.Characters(i))
IF (Zeich >= 97) AND (Zeich <= 122) THEN Zeich = Zeich - 1
IF (Zeich >= 65) AND (Zeich <= 90) THEN
Buchstaben(Zeich) = Buchstaben(Zeich) + 1
Gesamtanzahl = Gesamtanzahl + 1
END IF
NEXT i
Und schon dürfte das Programm um ein Vielfaches schneller laufen...
Grundsätzliche Optimerungsregel: Wenn ein Programm zu langsam läuft,
nachschauen wo man Schleifen verkürzen oder zusammenfassen könnte - Du
hattest erstmal schon das ganze Dokument zweimal durchsuchen lassen und
dabei auch noch eine unnötige 65 Schritte große Schleife eingebaut - bei
einer Textgröße von ca. 5000 Zeichen sind das 500*65 = 325000 Durchläufe
(statt 5000) !
Sollte ich irgendwo einen Syntaxfehler reingebaut haben (ich habe schon
lange kein BASIC mehr programmiert, sondern immer nur Pascal), wirst Du
das bestimmt finden.
Gruß,
Arno
--
http://afleck.home.pages.de (English and German)
Software, Links, C&C, Chartbreaker and more
http://pangea.home.pages.de (German only)
Mach mit bei einem Spiele-Projekt im Internet