Dubletten anhand Titel / Autor erkennen / ggf. Makro?

Bernd B. hinzugefügt 2 Jahren her
beantwortet

Grüß Euch,

ich möchte mehrere alte Projekte in ein Projekt zusammenführen (mit dem ich jetzt weiterarbeiten muss) und das klappt grundsätzlich ohne Problem. Allerdings kommen dabei ziemlich viele Dubletten zusammen, weil in den alten Projekten keine ISBN / sonstigen Nr. erfasst sind, die Citavi für den Dublettenabgleich braucht. Gibt es irgendeine Möglichkeit, ganz stumpf nach Titel / Autor abzugleichen?

Ich habe in einem Citavi Forum sogar ein Skript gefunden und entsprechend umgebaut und das funktioniert - allerdings weiß das Skript leider nicht, wann ein Beitrag zu einem Sammelwerk gehört und löscht so mal munter den Beitrag aus dem importierten Projekt A und das Sammelwerk aus dem importierten Projekt B ;-) => keine Vernüpfung mehr da.

Und da fehlt mir das Know-How das Skript entsprechend anzupassen. Hat jemand eine Idee (vielleicht geht es ja auch ohne Skript).

Viele Grüße

Bernd

using System;
using System.Linq;
using System.ComponentModel;
using System.Collections.Generic;
using System.Windows.Forms;

using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Citavi.Shell;
using SwissAcademic.Collections;

// Implementation of macro editor is preliminary and experimental.
// The Citavi object model is subject to change in future version.

public static class CitaviMacro
{
   public static void Main()
   {
      var project = Program.ActiveProjectShell.Project;
      var checkedReferences = new HashSet<Reference>();
      var referencesToDelete = new HashSet<Reference>();
      
      for (int i = 0; i < project.References.Count - 1; i++)
      {
         for (int j = i + 1; j < project.References.Count; j++)
         {
            if (checkedReferences.Contains(project.References[j])) continue;
            if (IsDuplicate(project.References[i], project.References[j]))
            {
               checkedReferences.Add(project.References[j]);
               referencesToDelete.Add(project.References[j]);
              
            }
         }
      }
      
      if (!referencesToDelete.Any())
      {
         MessageBox.Show("Es wurden keine Duplikate gefunden, die den Kriterien entsprechen.");
         return;
      }
      
      var dialogResult = MessageBox.Show(string.Format("Es wurden {0} Duplikate gefunden. Möchten Sie diese jetzt löschen?", referencesToDelete.Count), "Citavi", MessageBoxButtons.OKCancel);
      if (dialogResult != DialogResult.OK) return;
      
      project.References.RemoveRange(referencesToDelete);
      MessageBox.Show("Die Duplikate wurden gelöscht.");
   }
   
   static bool IsDuplicate(Reference a, Reference b)
   {
      if (a.ReferenceType != b.ReferenceType) return false;
      if (a.Title != b.Title) return false;
      if (a.Subtitle != b.Subtitle) return false;
      if (!a.Authors.SequenceEqual(b.Authors)) return false;
      if (!a.Editors.SequenceEqual(b.Editors)) return false;
      if (!a.Organizations.SequenceEqual(b.Organizations)) return false;
      if (a.Periodical != b.Periodical) return false;
      
      return true;
   }
   
}

Beste Antwort
Foto

Hallo, Bernd

Die eigentliche Dublettenprüfung macht ganz unten die Methode IsDuplicate(a, b). Um zu vermeiden, dass sie Beiträge von unterschiedlichen Sammelwerken als Dublette identifiziert, müsste dort folgende zusätzliche Prüfung genügen:

if (a.ParentReference != b.ParentReference) return false;
Viele Grüße

Sebastian

Antworten (2)

Foto
2

Hallo, Bernd

Die eigentliche Dublettenprüfung macht ganz unten die Methode IsDuplicate(a, b). Um zu vermeiden, dass sie Beiträge von unterschiedlichen Sammelwerken als Dublette identifiziert, müsste dort folgende zusätzliche Prüfung genügen:

if (a.ParentReference != b.ParentReference) return false;
Viele Grüße

Sebastian

Foto
1

Mega scheint zu klappen, herzlichen Dank!

Foto
Foto
1

Komischerweise hatte ich jetzt noch ein paar verwaiste Sammelwerkeinträge in der Datenbank. Ich habe das Makro mal umgebastelt. Nachdem ich kein C# kann, war das gar nicht so einfach, das alles zu verstehen, deswegen hänge ich das Makro hier mal an, falls es jemand brauchen kann - es sucht Beiträge in Sammelwerken, bei denen kein Sammelwerk angegeben ist und löscht diese auf Wunsch:


using System;
using System.Linq;
using System.ComponentModel;
using System.Collections.Generic;
using System.Windows.Forms;

using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Citavi.Shell;
using SwissAcademic.Collections;

// Implementation of macro editor is preliminary and experimental.
// The Citavi object model is subject to change in future version.

public static class CitaviMacro
{
   public static void Main()
   {
      var project = Program.ActiveProjectShell.Project;
      var checkedReferences = new HashSet<Reference>();
      var referencesToDelete = new HashSet<Reference>();
      
      for (int i = 0; i < project.References.Count - 1; i++)
      //for (int i = 0; i < 30; i++)
      {
       if (project.References[i].ReferenceType == ReferenceType.Contribution)   
		{
		 if (project.References[i].ParentReference == null) {
			referencesToDelete.Add(project.References[i]);
       	 	//MessageBox.Show(string.Format("Gefunden: {0} - {1}", project.References[i].Title, project.References[i].ParentReference), "Citavi", MessageBoxButtons.OK);
		}
		}
      }

       if (!referencesToDelete.Any())
      {
         MessageBox.Show("Es wurden keine verwaisten Beiträge gefunden");
         return;
      }
      
      var dialogResult = MessageBox.Show(string.Format("Es wurden {0} verwaiste Einträge gefunden. Möchten Sie diese jetzt löschen?", referencesToDelete.Count), "Citavi", MessageBoxButtons.OKCancel);
      if (dialogResult != DialogResult.OK) return;
      
      project.References.RemoveRange(referencesToDelete);
      MessageBox.Show("Die Duplikate wurden gelöscht.");
   } 
}

Wer erstmal einen Durchlauf machen will, um sich die gefundenen Werke anzuschauen, einfach die beiden // in der Zeile:

//MessageBox.Show(string.Format("Gefunden:...

rauslöschen.

Viele Grüße

b

Antwort schreiben
 
Dateianlage anfügen (KEINE vertraulichen Dokumente!)