Abschlussarbeit: Verwendete Literatur nach vorgegebener Namenskonvention als pdf speichern

Niklas M. hinzugefügt 36 Tagen her
beantwortet

Hallo zusammen,

ich stehe noch am Anfang meiner Masterarbeit und bin aktuell fleißig am Recherchieren.Dabei entwickelt sich auch mein Wissen über Citavi weiter und ich baue mittlerweile komplett in Citavi meinen Wissensschatz über das Thema meiner Arbeit auf.

Da absehbar ist, dass ich am Ende alle verwendeten Quellen in digitaler Form mit abgeben muss, möchte ich dahingehend eine Frage klären.Wie kann ich einfach und möglichst automatisiert alle verwendeten Quellen meiner Arbeit nach einer vorgegebenen Namenskonvention exportieren?

Kann ich eine Namenskonvention für die pdf Dateien vorgeben, ähnlich wie der Aufbau eines individuellen Zitationsstils, um die Dateien am Ende automatisch speichern zu können? Man kann die Dateien ja automatisch nach dem sog. Kurztitel benennen. Allerdings ist mir nicht ersichtlich ob und wo man den anpassen kann.

Zudem wird die Auswahl an Quellen in meiner Arbeit nachher nicht die gesamte Menge aller Quellen im Citavi Projekt sein. Gibt es einen einfachen Trick, wie man alle Quellen, die ich in einem Word Dokument auch in meinem Literaturverzeichnis habe, automatisch auswähle? Das hätte einerseits den Vorteil, dass es schnell geht und sich andererseits weniger Fehler einschleichen. Wenn ich eine lokale Archivkopie meines Cloud-Projektes erstelle, werden ja einfach alle Attachments in einem Ordner gespeichert, also fehlt dort die automatische Auswahl.

Das wollte ich jetzt schonmal klären, während ich mich noch in das Thema und Citavi einarbeite. :)Ich habe so die Befürchtung, dass es am Ende eh stressig wird und da kann ich auf manuelles abgleichen von Listen und Abgleich zwischen Dateinamen und -inhalt auch gut und gerne verzichten.


Vielen Dank schonmal für Antworten,

Grüße

Kommentare (6)

Foto
1

Hallo Niklas

Sie können aktuell über Citavi die PDF-Dateien nur mit dem Citavi Kurztitel automatisch benennen lassen. Sie müssten also ggf. den Kurztitel anpassen, um im zweiten Schritt die verknüpften PDFs umbenennen zu lassen.

Für die Selektion der PDFs anhand der wirklich verwendeten Quellen gehen Sie diesen Weg:


Schritt 1: Filtern

Erzeugen Sie in Citavi eine Auswahl der zitierten Titel. Dazu öffnen Sie das betreffende Citavi-Projekt und das Word-Dokument, das Sie mit Citavis Word Add-In erstellt haben. In Citavi wählen Sie dann den Filter aus, nur zitierte Titel angezeigt zu bekommen, s. Screenshot: http://screencast.com/t/vVKJrPo3pvZK

Schritt 2: Kopieren in neues Projekt

Wie hier beschrieben:http://www.citavi.com/sub/manual6/de/index.html?101_moving_or_copying_references.html

Schritte 3: Attachments z.B. auf CD brennen

Die einzureichenden PDFs liegen im Ordner Citavi Attachments des neuen Projekts.

Freundliche Grüsse

Peter

Foto
1

Schritt 2 würde ich gar nicht erst ansetzen, sondern man kann doch die Anhänge direkt speichern, dann kann man den Ort nach seiner Wahl aussuchen.

/e85a3cc686983043397454b5a661c5cb

Foto
1

Ehe Verzweiflung einsetzt mein kurzer Zwischenruf, dass es bzgl. der Dateinamen zwei Optionen gibt. Entweder man passt das Kurztitelschema an. Das geht, ist aber nicht ganz einfach, obwohl es da eine Schritt-für-Schritt-Anleitung im alten Forum gibt - das eigene Kurztitelschema ist nämlich genau das Beispiel, mit dem die Programmierung von AddOns erklärt wird.

Die zweite, simplere Methode, und das suche ich gerne aus dem Forum wieder raus (bin mir sicher, dass das schon mal kam ) oder stelle ein Beispielmakro zur Verfügung, ist es, ein Makro zu nehmen, welche die Dateianhänge nach eigenem Schema umbenennt. Was sollte das Dateinamensschema denn sein?

Foto
1

Danke für die Antworten bisher.

Peter, danke für die vollständige Beschreibung. Ich hatte allerdings gehofft, dass es da eine mehr Citavi-mäßige, praktischere Lösung gibt. :)

Ist der Wunsch, verwendete Quellen nach einem einheitlichen Muster abzuspeichern nicht eigentlich Standard bei jeder Abschlussarbeit oder jedem Bericht, wo ein Datenträger mit Quellen angefügt wird?

Gerade bei den Cloud Projekten, habe ich die pdfs der Attachments ja nicht mehr unbedingt geordnet vorliegen. Außerdem würde ich ungern am Ende nochmal alle Kurztitel durchgehen müssen, um zu gucken ob ich wirklich überall alles richtig von Hand eingegeben habe. Wenn in dem Kurztitel z.B. Autor und Titel vorkommen, würde ich auf lange Sicht lieber nur die Infos im Feld "Autor" und "Titel" ändern müssen und würde gerne diese Doppelung vermeiden.

Pragmarius, guter Tipp, das kürzt die Sache schonmal ab.

Jan, über die Infos würde ich mich freuen. Prinzipiell bin ich immer eher ein Fan davon, eine Art Template oder Schema zusammenzusetzen, dass der Rest dann automatisch läuft. Das Dateinamenschema wäre folgendes:<Kurzbeleg>+" "+<Titel>

Ich bin mir gerade nicht sicher, ob Kurzbeleg ein Standardfeld ist. Ich habe einen Zitationsstil, den mir die Unibib in Aachen nach den Vorgaben des Instituts gebastelt hat, die haben da so einen Service. In den Vorgaben des Instituts wird der Kurzbeleg aus drei Buchstaben des Autors oder der herausgebenden Organisation und zwei Ziffern der Jahreszahl gebildet. Bei Mehrdeutigkeiten gefolgt von a, b, c.

Im Anhang sieht man einmal das Feld Kurzbeleg und einmal einen Auszug aus dem Literaturverzeichnis. Der Teil in den eckigen Klammern entspricht dem Kurzbeleg.

Foto
1

Ich hab ein bisschen die Befürchtung, dass bei dem Schema die Dateinamen etwas sehr lang werden. Jedenfalls ginge das grundsätzlich so:

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Net;
using System.Linq;
using System.IO;
using System.Text;
using System.Globalization;

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

using System.Reflection;
using SwissAcademic.Citavi.Shell.Controls.Preview;

public static class CitaviMacro
{
	public static void Main()
	{
		if (Program.ProjectShells.Count == 0) return;		//no project open

		Program.ActiveProjectShell.PrimaryMainForm.PreviewControl.ShowNoPreview();
		
		List<Reference> references = Program.ActiveProjectShell.PrimaryMainForm.GetSelectedReferences();

		//reference to active Project
		Project activeProject = Program.ActiveProjectShell.Project;
		string rootPath = activeProject.Addresses.AttachmentsFolderPath;

		//counter and list references where rename failed
		int renameCounter = 0;
		List<Reference> renamingFailed = new List<Reference>();

		foreach (Reference reference in references)
		{
			if (reference.Locations.Count == 0) continue;

			int i = 0;

			var locations = reference.Locations.ToList().Where(a => a.LocationType == LocationType.ElectronicAddress && a.Address.LinkedResourceType == LinkedResourceType.AttachmentFile);

			foreach (Location location in locations)
			{
				if (location == null) return;
				if (location.Address == null) continue;
				if (location.Address.UriString == null) continue;
				
				i = i + 1;

				FileInfo fileInfo = new FileInfo(rootPath + "\\" + location.Address.UriString);
				string fileExtension = fileInfo.Extension;
				if (fileExtension.Equals("pdf", StringComparison.InvariantCultureIgnoreCase)) continue;

				string newFileName = string.Empty;
				string newFullPath = string.Empty;
				string folderPath = string.Empty;
				
				string s = location.Address.UriString;
				int idx = s.LastIndexOf('/');

				if (idx != -1)
				{
				    folderPath = s.Substring(0, idx);
					folderPath = folderPath.Replace('/', '\\');
				}				
			
				try
				{
					newFileName = CleanString(reference.CitationKey + " " + reference.Title);
				}
				catch (Exception e)
				{
					string mbMessage = "Filename for " + reference.ShortTitle + " cannot be generated. Correct reference info?";
					var noInfoForFilname = MessageBox.Show(mbMessage, "Citavi Macro", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
					if (noInfoForFilname == DialogResult.Yes)
					{
						List<Reference> incorrectReference = new List<Reference>();
						incorrectReference.Add(reference);
						var filter = new ReferenceFilter(incorrectReference, "References with data missing", false);
						Program.ActiveProjectShell.PrimaryMainForm.ReferenceEditorFilterSet.Filters.ReplaceBy(new List<ReferenceFilter> { filter });
						return;
					}
					else continue;
				}

				if (locations.Count() > 1) newFullPath += " (" + i.ToString() + ")";
				
				if (!string.IsNullOrEmpty(folderPath))
				{					
					newFullPath = rootPath + @"\" + folderPath + @"\" + newFileName + fileExtension;
				}
				{					
					newFullPath = rootPath + @"\" + newFileName + fileExtension;
				}
				string oldFullPath = rootPath + @"\" + location.Address.UriString;			
				
				if (!(File.Exists(oldFullPath)) && (File.Exists(newFullPath)))
				{
					System.IO.File.Move(newFullPath, oldFullPath);				

				}
				else if (File.Exists(newFullPath)) continue;

				try
				{
					location.Address.ChangeFilePathAsync(new System.Uri(newFullPath), AttachmentAction.Move);
					renameCounter++;
				}
				catch (Exception e)
				{
					MessageBox.Show("An error has occured while renaming " + location.Address + ":\n" + e.Message, "Citavi Macro", MessageBoxButtons.OK, MessageBoxIcon.Error);
					renamingFailed.Add(reference);
				}

			}// end foreach (Location location in reference.Locations)
		}// foreach (Reference reference in references)

		// Message upon completion
		string message = "{0} Locations have been renamed.";
		message = string.Format(message, renameCounter);

		if (renamingFailed.Count == 0)
		{
			MessageBox.Show(message, "Citavi Macro", MessageBoxButtons.OK, MessageBoxIcon.Information);
			return;
		}
		else
		{
			DialogResult showFailed = MessageBox.Show(message + "\n Would you like to show a selection of references where renaming has failed?", "Citavi Macro", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
			if (showFailed == DialogResult.Yes)
			{
				var filter = new ReferenceFilter(renamingFailed, "Renaming failed", false);
				Program.ActiveProjectShell.PrimaryMainForm.ReferenceEditorFilterSet.Filters.ReplaceBy(new List<ReferenceFilter> { filter });
				return;
			}
		}

		activeProject.SaveAsync();
	}

	private static string CleanString(string input)
	{
		char[] BAD_CHARS = new char[] { '?', '\\', '/', '?', '*', ':', '"', '“', '”', '‘', '’' };
		string output;
		output = input;
		output = RemoveDiacritics(output);
		output = string.Concat(output.Split(BAD_CHARS,StringSplitOptions.RemoveEmptyEntries));

		return output;
	}
	private static string RemoveDiacritics(string text)
	{
		var normalizedString = text.Normalize(NormalizationForm.FormD);
		var stringBuilder = new StringBuilder();

		foreach (var c in normalizedString)
		{
			var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
			if (unicodeCategory != UnicodeCategory.NonSpacingMark)
			{
				stringBuilder.Append(c);
			}
		}
		return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
	}
}
Man müsste sich überlegen, ob man bei überlangen Dateinamen den string "newFileName" irgendwann abkürzen will. Ich kann jetzt schon ankündigen, dass aufgrund meiner nicht-vorhanden Programmierkenntnisse, wenn das erforderlich sein sollte, ich nach "C# cut string after x characters" auf Google suchen werde. Mehr steckt da bei mir auch nicht hinter.

Übliche Warnung: besser erstmal an einem Testprojekt ausprobieren…

Foto
1

Vielen, vielen Dank für das Skript.

Ich werde es jetzt nicht direkt ausprobieren, aber wenn ich es tue, werde ich mal Feedback geben.

Ein bisschen mulmig ist mir bei so einem umfangreichen Skript dann schon, da man da immer mal auf unvorhergesehene Fehler stößt und dann doch wieder viel Zeit investieren muss.

Aber das ist mir immernoch deutlich lieber, als alles stupide von Hand zu benennen. ;)

Also danke dafür!

Foto