Flexible, verschachtelte Arrays zählen

Bild

Betrifft: Flexible, verschachtelte Arrays zählen
von: Christian
Geschrieben am: 13.07.2015 15:54:15

Hallo zusammen,
ich hänge momentan an folgendem Problem.
Ich habe zwei Texte (ca. 100 Wörter), die ich miteinander vergleichen möchte.
Dazu habe ich mir folgendes Vorgehen überlegt, da ich prüfen muss, ob teilweise Sätze ähnlich sind.
Ich erstelle ein Array und lese den Text ein.
Dann teile ich den Text mittels Split, sodass jedes Wort im Array steht.
Als nächstes soll dann Wort 1 bis 4 in ein eigenes Array geschrieben werden.
Gefolgt von Wort 2 bis 5, dann 3 bis 6 usw.
Das Gleiche mache ich dann auch mit dem zweiten Text.
Anschließend erfolgt der Abgleich der Arrays.
Wie oft ist das Array mit den Wörtern 1 bis 4 in Text 2 vorhanden?
Wie oft 2 - 5 usw.
Ich bin bisher nur bis zum Split gekommen, also dass ich die Wörter als einzelne Positionen im Array habe.
Für den Rest benötige ich Eure Hilfe.
Besten Dank im Voraus

Bild

Betrifft: Du könntest statt vbFkt 'Split' die ebenfalls ...
von: Luc:-?
Geschrieben am: 13.07.2015 19:46:22
…auf Split basierende UDF Splint benutzen, Christian,
wenn du das nicht alles selbst pgmmieren willst. Die kannst du dann in einem PgmZyklus (sog Schleife), der von 1 bis anzahlWorteImSatz - 3 läuft, einsetzen. Die UDF enthält bereits einen Auswahl­Mechanismus, der auf jeweils 4 Elemente (Worte) bei flfd wechselndem Beginn eingestellt wdn kann. Anderenfalls müsstest du wohl WorksheetFunction.Index einsetzen bzw den entsprd Teil der UDF übernehmen. Die Einzel-Arrays könnten dem AuswahlStart analog indiziert wdn und bilden dann einen Variant mit einem Array, genauer, ein Array, dessen Elemente ebenfalls aus Arrays bestehen. Dieser Vektor ist vertikal orientiert, während seine Element­Vektoren horizontal orientiert sind. Der Index für alle Vektoren (auch den vertikalen HptVektor!) ist stets 1dimensional. Ein Element eines Element­Vektors wird mit (i)(j) indiziert.
Mit einer um diese (innere) Schleife herum­liegenden äußeren, könntest du einen Text­Satz nach dem anderen aufrufen. Wenn du für alle Sätze ebenfalls einen Vektor anlegst, der dann den jeweiligen vertikalen SatzVektor enthält, kommst du auf 3 separate Indizes (i)(j)(k). i für den jeweiligen Satz, j für dessen 4-Elemente-Variationen und k für ein einzelnes Wort in der jeweiligen Variation.
Nachfolgend wird das WirkungsPrinzip für einen Satz, bei Einsatz der UDF in einer ZellFml gezeigt:

 KLMN
1Franz fährt heute mit dem Zug von Berlin nach Dresden.
2Franzfährtheutemit
3fährtheutemitdem
4heutemitdemZug
5mitdemZugvon
6demZugvonBerlin
7ZugvonBerlinnach
8vonBerlinnachDresden.
9K2:N2;K3[:N8]: {=Splint(K$1;;ZEILEN(A$1:A1);ZEILEN(A$1:A1)+3)}

Der PgmCode der UDF ist dann hier zu finden. Dort sind aber marginale Korrekturen nicht enthalten, weshalb ich ausnahmsweise noch den letzten Stand einstelle:

Rem Bildet aus Einzeltexten TeilTextFelder von…bis…Pos (lfdElemNr) im Text 
'   m.d.Möglichkeit Ersatz d.jeweiligen Endposition durch d.letzte Element
'   Vs 1.2a -Autor: LSr -CDate:20070427 -1Pub:20070428herber -LUpd:20080109n
Function Splint(Text, Optional Trenner As String = " ", Optional ByVal AnfPos As Integer, _
                Optional ByVal EndPos As Integer, Optional ByVal LetztEnd As Boolean)
    Dim i As Long, j As Long, l As Long, m As Long, TxtVkt, x, y() As String
    If AnfPos = 0 And EndPos = 0 Then Splint = Split(Text, Trenner): Exit Function
    If InStr(Text, Trenner) = 0 Then
        m = Len(Text)
        TxtVkt = Evaluate("if(row(1:" & m & ")=0,0,mid(""" & Text & """,row(1:" & m & "),1))")
    Else: TxtVkt = Split(Text, Trenner): m = UBound(TxtVkt) + 1 - LBound(TxtVkt)
    End If
    If AnfPos = 0 Then AnfPos = 1
    If EndPos = 0 Then EndPos = m
    l = EndPos - AnfPos: If l < 0 Then Exit Function
    ReDim y(l) As String
    For Each x In TxtVkt
        i = i + 1
        If i >= AnfPos And i <= m + CInt(LetztEnd) And _
            j <= l + CInt(LetztEnd) Then y(j) = x: j = j + 1
        If LetztEnd And (i = m Or j > l) Then y(l) = x: Exit For
    Next x
    Splint = y
End Function
Übrigens, diese alte UDF ist nicht aktiv matrixfml-fähig, d.h., ihr Argument1 (Text) muss stets ein einzelner Text oder ein Bezug auf einen solchen (nur 1 Zelle!) sein.
Gruß, Luc :-?

Besser informiert mit …

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Flexible, verschachtelte Arrays zählen"