Import aus Anno

Bernhard B. hinzugefügt 3 Monaten her
beantwortet

Ich verwende relativ häufig die Plattform ANNO der österreichischen Nationalbibliothek, die historische Zeitungen digitalisiert zur Verfügung stellt. http://anno.onb.ac.at/

Mein Vorschlag für jede Seite eine RIS-Datei zu generieren um den Import in eine Literaturverwaltung einfacher zu machen, hat man dort bis jetzt leider noch nicht aufgegriffen.

Allerdings hat sich das Importverhalten über den Picker jetzt verbessert. Und zwar wird der importierte Titel jetzt in der Form: "ANNO, Zeitungsname, Datum, Seite" übernommen. z.B: "ANNO, Böhmerwald Volksbote, 1911-06-24, Seite 6" Nachdem es in Citavi ja eine Makrofunktion gibt sollte es doch ein leichtes sein, die Angaben auf die verschiedenen Felder zu verteilen.


Meine Wunschvorstellung wäre:

Dokumententyp in Zeitungsartikel ändern, "Österreichische Nationabibliothek" aus dem Autorenfeld löschen. Zeitungsname in Feld Zeitung kopieren, Datum in die Form 24.6.1911 bringen und ins Datumsfeld kopieren und die Zahl von der Seitenzahl ins Seitenfeld kopieren.


Nachdem ich von der Makrofunktion leider keine Ahnung habe, frage ich mich, ob ich hier den Wunsch nach so einem Makro deponieren kann.

Antworten (4)

Foto
1

Dit sollte sich relativ trivial machen lassen, mit ein wenig Spaß am Basteln und einer Google-Suche nach "C# Split String Into List Comma Delimiter" vielleicht sogar selber (einfach mit Autocomplete im Editor rumprobieren, und den verschiedenen Eigenschaften der reference die jeweiligen Elemente der Liste zuweisen), aber ich gebe zu bedenken, dass die Ausgabe des Datums sich sowieso anpassen lässt, und es manchmal ganz sinnvoll sein kann die Daten nach ISO 8601 zu erfassen, wenn man mal in die Verlegenheit kommt, eine Liste alphanumerisch sortieren zu müssen. Ich erfasse Daten daher immer nach JJJJ-MM-TT.

Foto
1

Hallo zusammen,

folgendes als erste Anregung:

string[] splitTitle  = reference.Title.Split(',');

Periodical newspaper = new Periodical(activeProject, splitTitle[1]);				
activeProject.Periodicals.Add(newspaper);

reference.ReferenceType = ReferenceType.NewspaperArticle;
reference.Authors.Clear();
reference.Periodical = newspaper;

int page = 0;					
if(splitTitle.Length > 3 && Int32.TryParse(Regex.Match(splitTitle[3], @"\d+").Value, out page)) 
{
	reference.PageRange = page;				
}

reference.Date = splitTitle[2];
Viele Grüße

Sebastian

Foto
1

Naja, dann kann man direkt auch das ganze Skript posten, wie man sieht habe ich es etwas anders gemacht.


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()
	{
		List<Reference> references = Program.ActiveProjectShell.PrimaryMainForm.GetSelectedReferences();
		SwissAcademic.Citavi.Project activeProject = Program.ActiveProjectShell.Project;		

		foreach (Reference reference in references)
		{
			List<Person>  authors = reference.Authors.ToList();
			foreach (Person p in authors)
			{
				reference.Authors.Remove(p);
			}
			List<String> title = reference.Title.Split(new string[] { ", " }, StringSplitOptions.None).ToList<string>();
			
			reference.ReferenceType = ReferenceType.NewspaperArticle;
			reference.Title = "";
			reference.Date = title[2];
			reference.Periodical = new Periodical(activeProject, title[1]);
			reference.PageRange = title[3].Split(new string[] { " " }, StringSplitOptions.None)[1];
			
				
		}
	}
}
Mein Gedanke war der: ich kann nicht programmieren, mehr als das, was ich ich sehen kann, "da ist ein String, der logisch aus verschiedenen Teilen besteht, und die einzelnen Teile muß ich einzelnen Feldern zuweisen" weiß ich auch nicht (und ich wußte nicht auswendig wie das mit dem Splitten geht, ich gucke das immer wieder nach), aber mit ein bisschen Googlen, ein bisschen Basteln habe ich die Lösung gefunden, und vielleicht was gelernt, was ich auch in Zukunft einsetzen kann. Wenn man das mit den Makros einmal zu schätzen gelernt hat, wird es nämlich nicht bei einem bleiben.

Foto
1

Ein Beispiel meines ad-hoc-Ansatzes ist etwa das hier:


List<Person>  authors = reference.Authors.ToList();
			foreach (Person p in authors)
			{
				reference.Authors.Remove(p);
			}
Ich mach das nur deshalb, nicht weil ich weiß, daß das zu tun ist, sondern weil ich jedesmal merke, dass der intuitiv näherliegende Ansatz, einfach die Liste reference.Authors durchzugehen, zu einem Fehler führt (mir ist dann in Retrospektive schon klar warum, aber aus der ex ante-Perspektive des Programmierunkundigen gesprochen läge das näher), und ich mir dann überlege, wie ich wohl den Fehler vermeiden kann. Das "reference.Authors.Remove" überhaupt geht, weiß ich nur, weil das als Autocomplete-Option im Makro-Editor steht, und ich darauf vertraue, dass es das macht, wonach es klingt.

Foto