1.6k Aufrufe
Gefragt in Datenbanken von ralfh Mitglied (227 Punkte)
Hallo,
ich möchte gerne die Häufigkeit der Wörter in einem MS Access Memofeld ermitteln, und in einer Tabelle speichern.
Groß und Kleinschreibung soll nicht beachtet werden.

Beispieltext:
Wenn Fliegen hinter Fliegen fliegen, fliegen Fliegen hinterher.

Ergebnis:
Wort---Häufigkeit
Wenn---1
Fliegen---3
hinter---1
fliegen---2
hinterher---1

Wer kann mir dabei helfen?
Gruß Ralf

3 Antworten

0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo Ralf,

das Problem ist dar nicht so einfach zu lösen gewesen. Access vergleicht Tabellenfelder auf andere Weise als ein Vergleich im Modul mit der Einstellung "Option Compare Binary". Meine Felder in den beiden Tabellen "tblMemo" und "tblMemoWort" sind

tblmemo:
ID Autowert
memo memo

tblMemoWort:
ID Autowert
MemoWort text255
Anzahl long int

dann sieht mein Code so aus.


Option Compare Binary
Option Explicit

Public Sub MemoWortzähler()

Const sonderzeichen = "'.,;:/&%""!?+*."
Dim tblM As New adodb.Recordset
Dim tblMW As New adodb.Recordset
Dim s As String
Dim dbS As String
Dim w
Dim i As Long
Dim findwort As Boolean

DoCmd.RunSQL "DELETE * from tblMemoWort"

tblM.Open "tblMemo", CurrentProject.Connection, adOpenStatic, adLockReadOnly
tblMW.Open "tblMemoWort", CurrentProject.Connection, adOpenDynamic, adLockOptimistic

While Not tblM.EOF
s = tblM!memo
For i = 1 To Len(sonderzeichen)
s = Replace(s, Mid(sonderzeichen, i, 1), "")
Next
w = Split(s, " ")
For i = LBound(w) To UBound(w)
If w(i) <> "" Then
findwort = False
While Not tblMW.EOF And Not findwort
tblMW.Find "memowort = '" & w(i) & "'"
If Not tblMW.EOF Then
dbS = tblMW!memoWort
If w(i) = dbS Then
findwort = True
Else
tblMW.MoveNext
End If
End If
Wend
If findwort Then
tblMW!anzahl = tblMW!anzahl + 1
Else
tblMW.AddNew
tblMW!memoWort = w(i)
tblMW!anzahl = 1
End If
tblMW.Update
tblMW.MoveFirst
End If
Next
tblM.MoveNext
Wend
tblM.Close
tblMW.Close

End Sub



Ich hab's nicht komplett getestet, eine erste Orientierung sollte es jedoch sein. Deine Lösung kommt auf jeden Fall heraus. Sonderzeichen schmeiße ich einfach raus. Wenn du Fragen zum (schlecht dokumentierten) Code hast, poste es einfach. Ist dies, wonach du suchst?

Gruß
Ralf
0 Punkte
Beantwortet von joemar Einsteiger_in (7 Punkte)
Hallo RalfH,

hin und wieder programmiere ich auch etwas für Datenbanken. Allerdings in FoxPro ...

Folgenden Code habe ich mit der "Holzhammer-Methode" aus dem Boden gestampft. Die Routine erledigt grundsätzlich das, was Du haben möchtest.

* Temporäre Tabelle im Speicher erstellen mit einem Memofeld
create cursor test(TEXT M(4))
* leeren Satz einfügen
do blank

* Memofeld mit Beispieltext füllen
replace TEXT with "Wenn Fliegen hinter Fliegen fliegen, fliegen Fliegen hinterher."

* Jedes Leerzeichen durch Zeilenumbruch ersetzen
replace TEXT with strtr(TEXT," ",chr(13))

* Anzahl Zeilen ermitteln (für Schleife)
nZeilen=memlines(TEXT)

* Variablen für Schleifendurchlauf initialisieren
nZaehler=1
cWort=""

* weitere Tabelle für jede einzelne Zeile des Memofeldes temporär erstellen
create cursor ergebnis1(WORT C(254))

* In der Schleife jede Zeile des Memofeldes in einen Datensatz wandeln
do while nZaehler<=nZeilen
select TEST
cWort=mline(TEXT,nZaehler)
insert into ergebnis1(WORT) values(cWort)
nZaehler=nZaehler+1
enddo

select ergebnis1
go top

* einzelne Wörter von Sonderzeichen befreien
do while !eof()
replace WORT with strtr(WORT,",","")
replace WORT with strtr(WORT,".","")
skip
enddo

* 1. Ergebnis, wobei Groß- Kleinschreibung berücksichtigt wird
select WORT,count(1) as ANZ from ergebnis1 group by WORT into cursor ERGEBNIS2
brow

* jedes Wort in Großbuchstaben wandeln
select ergebnis1
go top

do while !eof()
replace WORT with upper(WORT)
skip
enddo

* 2. Ergebnis, wobei Groß- Kleinschreibung nicht mehr berücksichtigt wird
select WORT,count(1) as ANZ from ergebnis1 group by WORT into cursor ERGEBNIS3
brow
select WORT,count(1) as ANZ from ergebnis1 group by WORT into cursor ERGEBNIS3
brow

Wenn auch die Befehle in Access vermutlich im Einzelnen anders lauten, sollte das Grundgerüst auch in Access verwendbar sein.
Schreib zurück, wenn Du mit dieser Lösung etwas anfangen konntest.

(PS: sicher geht das Ganze auch eleganter ... aber wie gesagt: Holzhammer ... ;-) )
Gruß JoeMar
0 Punkte
Beantwortet von ralfh Mitglied (227 Punkte)
Guten Morgen,
@ RaHi
@JoeMar
Ihr beide habt ein sehr großen Anteil an der Lösung des Problems, dafür recht herzlichen Dank !
Gruß Ralf
...