Is there a way to compare all the titles of all Rss feeds and delete duplicates? [duplicate]

依然范特西╮ 提交于 2019-12-11 04:26:39

问题


I'm wondering if there is a way to compare ALL TITLES in ALL RSS FEEDS and delete the duplicates.

I read through a lot of RSS Feeds, and it's obvious that a lot of people cross-post to several forums, and then I end up seeing the same RSS Feed multiple times.

I really just want to see each one one single time. Is there a way to list all feeds, and delete duplicates, if I actually have duplicates in my entire MS Outlook RSS Feed list?

Here's 0m3r's script, modified slightly.

Option Explicit
Public Sub Example()
Dim olNs As Outlook.NameSpace
Dim RSS_Folder As Outlook.MAPIFolder
Dim Item As Object
Dim Items As Items
Dim DupItem As Object
Dim i As Long
Dim j As Long

For j = 1 To 21
    Set olNs = Application.GetNamespace("MAPI")
    Set RSS_Folder = olNs.GetDefaultFolder(olFolderRssFeeds).Folders(j)

    Set DupItem = CreateObject("Scripting.Dictionary")
    Set Items = RSS_Folder.Items

    For i = Items.Count To 1 Step -1
        DoEvents
        If TypeOf Items(i) Is PostItem Then
            Set Item = Items(i)
            If DupItem.Exists(Item.Subject) Then
                Debug.Print Item.Subject ' Print on Immediate Window
                Debug.Print TypeName(Item) ' Print on Immediate Window
                Item.Delete
            Else
                'Debug.Print Item.Subject
                DupItem.Add Item.Subject, 0
            End If
        End If
    Next i
    Debug.Print RSS_Folder
Next j

Set olNs = Nothing
Set RSS_Folder = Nothing
Set Item = Nothing
Set Items = Nothing
Set DupItem = Nothing
End Sub


回答1:


Iterating over all items in the folder is not really a good idea.

 For Each myItem In subFolder.Items
    If InStr(myItem.Subject, "[on hold]") > 0 Then

You can use the Find/FindNext or Restrict methods of the Items class to find all items that correspond to your conditions. Read more about them in the following articles:

  • How To: Use Find and FindNext methods to retrieve Outlook mail items from a folder (C#, VB.NET)

  • How To: Use Restrict method to retrieve Outlook mail items from a folder

Also you may find the AdvancedSearch method of the Application class helpful.

The key benefits of using the AdvancedSearch method in Outlook are:

  • The search is performed in another thread. You don’t need to run another thread manually since the AdvancedSearch method runs it automatically in the background.
  • Possibility to search for any item types: mail, appointment, calendar, notes etc. in any location, i.e. beyond the scope of a certain folder. The Restrict and Find/FindNext methods can be applied to a particular Items collection (see the Items property of the Folder class in Outlook).
  • Full support for DASL queries (custom properties can be used for searching too). You can read more about this in the Filtering article in MSDN. To improve the search performance, Instant Search keywords can be used if Instant Search is enabled for the store (see the IsInstantSearchEnabled property of the Store class).
  • Finally, you can stop the search process at any moment using the Stop method of the Search class.

Read more about that in the Advanced search in Outlook programmatically: C#, VB.NET article.




回答2:


Work with Dictionary Object to compare Items.Subject in your olFolderRssFeeds


Dictionary in VBA is a collection-object: you can store all kinds of things in it: numbers, texts, dates, arrays, ranges, variables and objects, Every item in a Dictionary gets its own unique key and With that key you can get direct access to the item (reading/writing).


Here is quick Example code

Option Explicit
Public Sub Example()
    Dim olNs As Outlook.NameSpace
    Dim RSS_Folder As Outlook.MAPIFolder
    Dim Item As Object
    Dim Items As Items
    Dim DupItem As Object
    Dim i As Long

    Set olNs = Application.GetNamespace("MAPI")
    Set RSS_Folder = olNs.GetDefaultFolder(olFolderRssFeeds) _
                         .Folders("Microsoft At Home")

    Set DupItem = CreateObject("Scripting.Dictionary")
    Set Items = RSS_Folder.Items

    For i = Items.Count To 1 Step -1
        DoEvents
        If TypeOf Items(i) Is PostItem Then
            Set Item = Items(i)
            If DupItem.Exists(Item.subject) Then
                Debug.Print Item.subject ' Print on Immediate Window
                Debug.Print TypeName(Item) ' Print on Immediate Window
'               Item.Delete
            Else
                DupItem.Add Item.subject, 0
            End If
        End If
    Next i

    Set olNs = Nothing
    Set RSS_Folder = Nothing
    Set Item = Nothing
    Set Items = Nothing
    Set DupItem = Nothing
End Sub

This Example shows how to process all Folders under RSS Feed Folders


Option Explicit
Public Sub DupeRSS()
    Dim olNs As Outlook.NameSpace
    Dim RSS_Folder As Outlook.MAPIFolder

    Set olNs = Application.GetNamespace("MAPI")
    Set RSS_Folder = olNs.GetDefaultFolder(olFolderRssFeeds)

'   // Process Current Folder
    Example RSS_Folder
End Sub
Public Sub Example(ByVal ParentFolder As Outlook.MAPIFolder)
    Dim Folder As Outlook.MAPIFolder
    Dim Item As Object
    Dim DupItem As Object
    Dim Items As Items
    Dim i As Long

    Set DupItem = CreateObject("Scripting.Dictionary")
    Set Items = ParentFolder.Items

    For i = Items.Count To 1 Step -1
        DoEvents
        If TypeOf Items(i) Is PostItem Then
            Set Item = Items(i)
            If DupItem.Exists(Item.subject) Then
                Debug.Print Item.subject ' Print on Immediate Window
                Debug.Print TypeName(Item) ' Print on Immediate Window
                Item.Delete
            Else
                DupItem.Add Item.subject, 0
            End If
        End If
    Next i

'   // Recurse through subfolders
    If ParentFolder.Folders.Count > 0 Then
        For Each Folder In ParentFolder.Folders
            Example Folder
            Debug.Print Folder.Name
        Next
    End If

    Set Folder = Nothing
    Set Item = Nothing
    Set Items = Nothing
    Set DupItem = Nothing
End Sub

Remember the code will only compare duplicate in single folder



来源:https://stackoverflow.com/questions/45404373/is-there-a-way-to-compare-all-the-titles-of-all-rss-feeds-and-delete-duplicates

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!