Dubletten anhand Titel / Autor erkennen / ggf. Makro?
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; } }
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:
Viele GrüßeSebastian
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:
Viele GrüßeSebastian
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:
Viele GrüßeSebastian
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:
Viele GrüßeSebastian
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:
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
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:
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
Diese Diskussion wurde geschlossen. Bitte erstellen Sie bei Bedarf einen neuen Beitrag.