Top-Themen

Aktuelle Themen (A bis Z)

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 String-Vergleich optimieren

Mitglied: MarcoBorn

MarcoBorn (Level 1) - Jetzt verbinden

12.07.2019 um 10:01 Uhr, 192 Aufrufe, 4 Kommentare

Hallo Forum,
ich habe folgenden Code-Schnipsel (vereinfacht):
01.
With mObjWordApplication
02.
  For intI As Integer = 1 To .Paragraphs.Count
03.
    If InStr(.Paragraphs(intI).Range.Text, mObjDOKRM.GetString("String456", DOKCulture), CompareMethod.Text) > 0 OrElse
04.
    InStr(.Paragraphs(intI).Range.Text, mObjDOKRM.GetString("String434", DOKCulture), CompareMethod.Text) > 0 OrElse
05.
    InStr(.Paragraphs(intI).Range.Text, mObjDOKRM.GetString("String457", DOKCulture), CompareMethod.Text) > 0 OrElse
06.
    InStr(.Paragraphs(intI).Range.Text, mObjDOKRM.GetString("String433", DOKCulture), CompareMethod.Text) > 0 OrElse
07.
    InStr(.Paragraphs(intI).Range.Text, mObjDOKRM.GetString("String436", DOKCulture), CompareMethod.Text) > 0 OrElse
08.
    InStr(.Paragraphs(intI).Range.Text, mObjDOKRM.GetString("String439", DOKCulture), CompareMethod.Text) > 0 OrElse
09.
    InStr(.Paragraphs(intI).Range.Text, mObjDOKRM.GetString("String437", DOKCulture), CompareMethod.Text) > 0 OrElse
10.
    InStr(.Paragraphs(intI).Range.Text, mObjDOKRM.GetString("String438", DOKCulture), CompareMethod.Text) > 0 OrElse
11.
    InStr(.Paragraphs(intI).Range.Text, mObjDOKRM.GetString("String435", DOKCulture), CompareMethod.Text) > 0 Then
12.
      ....
13.
    End If
14.
  Next
15.
End With
Ich vergleiche für jeden Absatz eines Word-Textes Inhalte mit 9 Strings, die ich in einer Ressourcen-Tabelle abgelegt habe. Ein Teil der Absätze enthält jeweils einen der gesuchten Strings. Bei der u.U. sehr großen Word-Dateien dauert das ziemlich lange.

Wie kann ich diese If-Then-Else-Verschachtelungen optimieren, so dass ich hier einen Performancegewinn erzielen kann? Ginge sowas ggf. mit einer RegEx?

Vielen Dank,
M. Born
Mitglied: emeriks
LÖSUNG 12.07.2019, aktualisiert um 10:21 Uhr
Hi,
zumindest kannst Du den Code drastisch vereinfachen. (lesbarer gestalten)
Ob das dann schneller ist, muss man testen.

01.
With mObjWordApplication
02.
    Dim IC = StringComparer.CurrentCultureIgnoreCase
03.
  For intI As Integer = 1 To .Paragraphs.Count
04.
     Dim Text as string = .Paragraphs(intI).Range.Text
05.
     If Text.Contains(mObjDOKRM.GetString("String456", DOKCulture), IC) OrElse
06.
         Text.Contains(mObjDOKRM.GetString("String434", DOKCulture), IC) OrElse _
07.
         ........  Then
08.
      ....
09.
    End If
10.
  Next
11.
End With
Oder weiter
01.
With mObjWordApplication
02.
  For intI As Integer = 1 To .Paragraphs.Count
03.
     Dim Text as string = .Paragraphs(intI).Range.Text
04.
     Dim GetStringFound as boolean = False
05.
     For Each GetString  In {"String456", "String434", "String457", "String433",......}
06.
        GetStringFound = Text.Contains(mObjDOKRM.GetString(GetString, DOKCulture), StringComparer.CurrentCultureIgnoreCase)
07.
        If GetStringFound Then Exit For
08.
     Next
09.
    If GetStringFound Then
10.
      ....
11.
    End If
12.
  Next
13.
End With

E.
Bitte warten ..
Mitglied: MarcoBorn
12.07.2019 um 10:23 Uhr
Vielen Dank. Den StringComparer kannte ich noch nicht.
Bitte warten ..
Mitglied: colinardo
LÖSUNG 12.07.2019, aktualisiert um 11:58 Uhr
Servus.
Oder man nutzt gleich die im Word Object integrierte Suche mit dem Array aus Suchbegriffen in einer Schleife, das liefert auch gleich den Range mit wo die Fundstelle erfolgreich war:
https://docs.microsoft.com/de-de/office/vba/api/word.find.execute
Das eliminiert die langsame Schleife über alle Absätze.

Oder eben mit Regex auch kein Problem
01.
Dim arrSearchTerms As String() = {"String456", "String443"}
02.
Dim arrEscaped = arrSearchTerms.Select(Function(str) System.Text.RegularExpressions.Regex.Escape(str))
03.
Dim strPattern As String = String.Join("|", arrEscaped)
04.

05.
With mObjWordApplication
06.
    For intI As Integer = 1 To .Paragraphs.Count
07.
        If System.Text.RegularExpressions.Regex.IsMatch(.Paragraphs(intI).Range.Text, strPattern) Then
08.
            '....
09.
        End If
10.
    Next
11.
End With
12.
Grüße Uwe
Bitte warten ..
Mitglied: MarcoBorn
12.07.2019 um 13:09 Uhr
Hallo Uwe,
auch danke für Deinen Code. Im Vergleich zu meinem bisherigen konnte ich die Durchlaufzeit auf ca. 1/3 reduzieren.

Schönes Wochenende,
M. Born
Bitte warten ..
Ähnliche Inhalte
CPU, RAM, Mainboards
CPU Vergleich
Frage von M.MarzCPU, RAM, Mainboards7 Kommentare

Hallo zusammen, ich würde gerne einen neuen Laptop kaufen und habe die Auswahl zwischen dem Prozessor Intel® Core™ i5 ...

Microsoft Office
Excel Tabellen Vergleich
gelöst Frage von Dr.CornwallisMicrosoft Office1 Kommentar

Liebe Gemeinde, ich habe einen VBA Code, dieser vergleicht eine Spalte mit anderen Spalten aus anderen Blättern. Verglichen wird ...

Java
Von Delphi String zu Java String
Frage von GreenDinoJava1 Kommentar

Hallo zusammen! Ich bin dabei Delphicode in Javacode zu übertragen. Frage: ist '<text>' in Delphi equivalent zu "<text>" in ...

Visual Studio
DotNet String Sortierung
gelöst Frage von emeriksVisual Studio5 Kommentare

Hi, habe hier im .Net einen komischen Effekt beim Sortieren von Strings. Gegeben sind 3 Strings (in Wunsch-Reihenfolge) ABC-XY-100 ...

Neue Wissensbeiträge
Backup

Veeam Agent für MS Windows - neue Version verfügbar (bedingt jedoch offenbar .NET Framework 4.6)

Information von VGem-e vor 23 StundenBackup

Moin Kollegen, einer unserer Server zeigte grad an, dass für o.g. Software ein Update verfügbar ist. Ob ein evtl. ...

Python

Sie meinen es ja nur gut - Microsoft hilft python-Entwicklern auf unnachahmliche Weise

Information von DerWoWusste vor 2 TagenPython2 Kommentare

Stellt Euch vor, Ihr nutzt python unter Windows 10 und skriptet damit regelmäßig Dinge. Nach dem Update auf Windows ...

Sicherheits-Tools

TrendMicro Worry-Free Business Security 10.0 SP1 steht in Englisch bereit mit Unterstützung für Windows 10 1903 (May Update)

Information von VGem-e vor 2 TagenSicherheits-Tools1 Kommentar

Moin Kollegen, Dann kommt wohl demnächst auch die deutschsprachige/europäische Version zur Auslieferung. Gruß VGem-e

Batch & Shell
PowerShell Konferenz - Videos online
Information von NetzwerkDude vor 3 TagenBatch & Shell

Abend, die Tage werden Videos der Talks von der diesjährigen EU Powershell Konferenz hochgeladen, sind einige Interessante dabei: MFG ...

Heiß diskutierte Inhalte
Google Android
Anbieter für Diensthandys
Frage von Pat.batGoogle Android24 Kommentare

Hallo zusammen, ich bin seit einiger Zeit zuständig für die Diensthandys bei uns in der Behörde. Eine Management Software ...

Windows Server
Windows Server 2016 einrichten
Frage von borjiaWindows Server20 Kommentare

Ich würde gerne einen Server einrichten, erstmal nur mit DNS und AD. Habe mich die letzten Wochen durch diverse ...

Exchange Server
Vorgehen um von Tobit auf Exchange zu wechseln
Frage von Martin1987Exchange Server17 Kommentare

Guten Abend Ich habe den Auftrag erhalten, unser Mail von David zu Outlook zu wechseln. Wie muss ich da ...

Microsoft Office
Office 365 eMail via Website verschicken
Frage von BiBeSoMicrosoft Office16 Kommentare

Hallo, kann man im Office 365 eMails anlegen welche zum versenden (smtp) für die Website funktionieren ? Muss man ...