| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	 
	
	
		| Autor | 
		Nachricht | 
	 
	
		JK •->
  
 
  Anmeldedatum: 28.11.2010 Beiträge: 1
 
  | 
		
			
				 Verfasst am: 28.11.2010 - 19:02    Titel: Dateinamen prüfen, Dateien kopieren via Droplet | 
				     | 
			 
			
				
  | 
			 
			
				Liebe Community,
 
 
ich bin Einsteiger in Sachen applescript und mir schwebt vor folgendes automatisiert vornehmen zu lassen um die ankommende Datenflut für meine Projekte zu verwalten und für die nachgelagerten Schritte die Produktionssicherheit zu gewährleisten:
 
 
Unterschiedliche Dateien sollen per Droplet wie folgt verarbeitet werden:
 
 
Prüfung des Dateinamens auf:
 
 
- den ersten Teil der Zeichenkette im Dateinamen, zu der jeweils bereits ein gleichnamiger Projektordner in einem Überordner "Projekte" auf der Festplatte existieren muss ("5-stellige Projektnummer_Projektname")
 
- verschiedene von mir definierte weitere Zeichen in der Kette (12345_Projektname_Bild; 12345_Projektname_Lied; …)
 
- jeweils erlaubtes Suffix dazu ("12345_Projektname_Bild.jpg")
 
 
Falls was nicht stimmt: Fehlermeldung, bestenfalls detailliert  + die Datei läuft in einen Fehlerordner
 
 
Wenn der Dateiname konform ist:
 
 
- Kopieren der Datei in "Projekte", den dazugehörigen Projektordner/ direkt in einen für diesen Dateityp vorgesehenen, schon bestehenden Unterordner  ("12345_Projektname_Bild.jpg" in Ordner "12345_Projektname", Unterordner "Bilder")
 
 
 
Viel Text führt zur eigentlichen Frage:
 
Lassen sich diese Aktionen überhaupt über appleskript lösen und wie kann ich an diese Sache herangehen?
 
 
Für jeden kleinen Hinweis bin ich sehr dankbar! | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		woodpecker •--->
  
 
  Anmeldedatum: 12.10.2010 Beiträge: 150 Wohnort: Roggentin/Rostock
  | 
		
			
				 Verfasst am: 29.11.2010 - 18:15    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo,
 
prinzipiell ist das wohl lösbar. Ich habe zwar nicht die komplette Lösung. Das hast Du auch sicher nicht erwartet, aber ich kann Dir ungefähr eine Lösungsskizze geben.
 
 
Für ein Droplet brauchst Du einen on-open-Handler, der die Dateiliste verarbeitet. Kann ungefähr so aussehen:
 
 
on open TheFileList
 
	repeat with i from 1 to count TheFileList
 
		set Dat to item i of TheFileList as string
 
		set Dat to POSIX path of Dat
 
		exec(Dat)
 
	end repeat
 
end open
 
 
 
Die eigentliche Verarbeitung erfolgt dann in dem Handler, den ich hier exec genannt habe. Der ist zwar etwas UNIX-lastig, aber da Du mit Filenamen-Pattern arbeiten willst, ist das wohl die bessere Variante.
 
 
on exec(TheFile)
 
	#File-Namen iolieren
 
	set base to do shell script "basename " & TheFile
 
	# Directory isolieren
 
	set dir to do shell script "dirname " & TheFile
 
	set PrjFolder to dir & "/Projekte"
 
	
 
	# Hier kommt jetzt die weitere Verarbeitung
 
	
 
	# Prüfen, ob Subfolder entsprechend base existiert
 
	# wenn ja, move in Folder, sonst move in Lumpensammler
 
	
 
	
 
	
 
end exec
 
 
 
Da hast Du jetzt immer noch genug zu tun.
 
Viel Erfolg | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Skeeve •---->
  
  
  Anmeldedatum: 20.04.2006 Beiträge: 1067
 
  | 
		
			
				 Verfasst am: 30.11.2010 - 22:03    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Probier es mal hiermit:
 
 	  | Code: | 	 		  
 
on run
 
   -- Das hier ist praktisch, wenn man
 
   -- mal nicht unbedingt das ganze per
 
   -- droplet testen will sondern Dateien
 
   -- auswählen möchte.
 
   open (choose file with multiple selections allowed)
 
end run
 
 
on open some_things
 
   repeat with thing in some_things
 
      set the_result to split_filename(thing)
 
      if the_result is not false then
 
         set {fldr, prjnum, prjname, elem, ext} to the_result
 
         -- Hier hast Du alles zerlegt und kannst
 
         -- prüfen, ob es Deinen Vorgaben entsprcht.
 
         -- Z.B.
 
         try
 
            set prjnum to prjnum as integer
 
            if prjnum > 9999 and prjnum < 100000 then
 
               -- prjnum okay
 
            else
 
               -- prjnum keine 5 Stellen
 
               -- (wenn führende Nullen ausgeschlossen
 
               -- sind natürlich nur
 
            end if
 
         on error
 
            -- prjnum keine Zahl
 
         end try
 
         
 
      else
 
         -- weitere Fehlerbehandlung möglich
 
      end if
 
   end repeat
 
end open
 
 
to split_filename(thing)
 
   set thing to thing as alias
 
   tell application "Finder"
 
      set ext to name extension of thing
 
      set fname to displayed name of thing
 
      set el to length of ext
 
      if el > 0 then
 
         set fname to text 1 thru (-2 - el) of fname
 
      end if
 
      set oastid to AppleScript's text item delimiters
 
      set AppleScript's text item delimiters to "_"
 
      try
 
         set {prjnum, prjname, elem} to text items of fname
 
         set AppleScript's text item delimiters to oastid
 
         return {container of thing, prjnum, prjname, elem, ext}
 
      end try
 
      set AppleScript's text item delimiters to oastid
 
      -- Fehlerbehandlung hier
 
      return false
 
   end tell
 
end split_filename
 
 | 	 
  _________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		kipp •-->
  
 
  Anmeldedatum: 27.03.2007 Beiträge: 73 Wohnort: Göttingen
  | 
		
			
				 Verfasst am: 13.07.2011 - 00:05    Titel: Super Script | 
				     | 
			 
			
				
  | 
			 
			
				Hallo Skeeve, Hallo Scripter,
 
 
Super - genau so etwas habe ich gerade gesucht! Ich hätte aber noch zwei Fragen dazu...
 
 
Ich würde gerne ein paar Abkürzungen im String durch Bezeichnungen ersetzen - also zum Beispiel aus 1234_H_2001.png ein "1234 (tab) Haus (tab) 2001 (tab) png" machen, um die Daten anschließend in Excel einlesen zu können. Das klappt so weit ganz gut mit 
 
 
 	  | Code: | 	 		  if prjPlan = "H" then set prjPlan to "Haus"
 
if prjPlan = "B" then set prjPlan to "Boot" | 	  
 
 
und so weiter - geht aber doch bestimmt bei längeren Listen auch eleganter, oder? Hat jemand einen Anfängertipp für mich?
 
 
Zweite Frage: mein letzter String geht über mehrere Delimiters - so was in der Art von 
 
 
 	  | Code: | 	 		  | 2011_H_ABC-123_Hier_steht_Text.pdf | 	  
 
 
wobei "Hier_steht_Text" unterschiedlich lange Texte sein können, die jedoch zu einem Abschnitt gehören. Der erste Teil (2011_H_ABC-123_) hat nicht immer die selbe Länge (könnte z.B. auch 2011_H_ABCDE-12345_ sein), dafür aber immer die selbe Anzahl von Abschnitten.
 
 
Gibt es eine Möglichkeit, diesen letzten Abschnitt als ein zusammenhängendes Element zu identifizieren und als solches zu übergeben? Also als "Hier steht Text" ?
 
 
kipp | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Skeeve •---->
  
  
  Anmeldedatum: 20.04.2006 Beiträge: 1067
 
  | 
		
			
				 Verfasst am: 13.07.2011 - 18:18    Titel: Re: Super Script | 
				     | 
			 
			
				
  | 
			 
			
				Sowas setze ich meist so um:
 
 
 	  | Code: | 	 		  property zuordnung : "
 
:H=>Haus
 
:P=>Plan
 
:B=>Bau
 
"
 
 
to langtext(kurz)
 
   set o to offset of (":" & kurz & "=>") in zuordnung
 
   if o < 1 then return "-"
 
   return first paragraph of (text (o + 3 + (length of kurz)) thru -1 of zuordnung)
 
end langtext
 
 
on run
 
   set kurz to "-"
 
   set lang to "-"
 
   repeat
 
      set kurz to display dialog "Kurz " & kurz & " ist lang " & lang default answer kurz
 
      set kurz to the text returned of kurz
 
      set lang to langtext(kurz)
 
   end repeat
 
end run
 
 | 	 
  _________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		kipp •-->
  
 
  Anmeldedatum: 27.03.2007 Beiträge: 73 Wohnort: Göttingen
  | 
		
			
				 Verfasst am: 16.07.2011 - 12:08    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hallo Skeeve,
 
 
das sieht gleich wesentlich kompakter aus! Vielen Dank für den Code!!
 
 
Die Geschichte mit den TIDs scheint aufwendiger zu sein. Habe noch mal im Netz gesucht, bin aber bisher nicht wirklich fündig geworden.
 
 
Vielleicht gibt es aber auch eine andere Möglichkeit? Hier noch einmal das Problem: Ich habe einen Haufen Dateien, deren Namen ich in eine Excel-Liste übergeben möchte. Die einzelnen Abschnitte sollen in einzelne Zellen übergeben werden. Mit dem Skript oben klappt das wunderbar, wenn die Delimiters durch Tabs ersetzt werden und die Liste in die Zwischenablage übergeben wird. Beim Einfügen in Excel entsteht so aus ...
 
 
 	  | Code: | 	 		  | 2011_H_ABC-123_Hier_steht_Text.pdf | 	  
 
(TID "_")
 
 
oder
 
 
 	  | Code: | 	 		  | 2011_H_ABC-123_Hier_steht_Text.pdf | 	  
 
(TID " ")
 
 
das hier:
 
 
 	  | Code: | 	 		  |  | 2011 | H | ABC-123 | Hier | steht | Text |  | 	  
 
 
Ich hätte aber gerne so was:
 
 
 	  | Code: | 	 		  |  | 2011 | H | ABC-123 | Hier steht Text |  | 	  
 
(alles TIDs nach dem 3. TID ignoriert und den Text in einer Zelle)
 
 
Denkbar wäre so was:
 
 
 	  | Code: | 	 		  | 2011.H.ABC-123.Hier steht Text.pdf | 	  
 
 
Das würde ich wegen der dann notwendigen Punkte in den Dateinamen aber gerne vermeiden.
 
 
Vielleicht hat ja jemand eine Idee dazu...
 
 
Viele Grüße,
 
>>> kipp :-) | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Skeeve •---->
  
  
  Anmeldedatum: 20.04.2006 Beiträge: 1067
 
  | 
		
			
				 Verfasst am: 16.07.2011 - 22:13    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hilft Dir das?
 
 
 	  | Code: | 	 		  
 
 
on run
 
   -- in 4 Teile brechen
 
   set {spalte1, spalte2, spalte3, rest_text} to split_max("_", "2011_H_ABC-123_Hier_steht_Text.pdf", 4)
 
   -- extension abtrennen
 
   -- dazu erst bei Punkten trennen
 
   -- anschließend alle, bis aufs letzte wieder
 
   -- zusammenbauen
 
   try
 
      set rest_text to join_list(".", items 1 thru -2 of split(".", rest_text))
 
   end try
 
   -- "_" durch " " ersestzen
 
   set rest_text to join_list(" ", split("_", rest_text))
 
   -- Alles mit tab zusammenfügen
 
   set zeile to join_list(tab, {spalte1, spalte2, spalte3, rest_text})
 
   return zeile
 
end run
 
 
-- Text in Liste wandeln
 
-- dabei an at_char aufbrechen 
 
to split(at_char, the_text)
 
   set oastid to AppleScript's text item delimiters
 
   set AppleScript's text item delimiters to at_char
 
   set the_result to text items of the_text
 
   set AppleScript's text item delimiters to oastid
 
   return the_result
 
end split
 
 
-- Text in Liste mit maximal cnt Elementen wandeln
 
-- dabei an at_char aufbrechen 
 
to split_max(at_char, the_text, cnt)
 
   set the_result to {}
 
   repeat with i from 2 to cnt
 
      set o to offset of at_char in the_text
 
      if o < 1 then exit repeat
 
      copy text 1 thru (o - 1) of the_text to the end of the_result
 
      set the_text to text (o + 1) thru -1 of the_text
 
   end repeat
 
   return (the_result) & the_text
 
end split_max
 
 
-- Liste zu Text wandeln.
 
to join_list(with_char, the_elements)
 
   set oastid to AppleScript's text item delimiters
 
   set AppleScript's text item delimiters to with_char
 
   set the_result to the_elements as text
 
   set AppleScript's text item delimiters to oastid
 
   return the_result
 
end join_list | 	 
  _________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Skeeve •---->
  
  
  Anmeldedatum: 20.04.2006 Beiträge: 1067
 
  | 
		
			
				 Verfasst am: 16.07.2011 - 22:20    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				P.S. In Perl hätte ich das so gemacht:
 
 
 	  | Code: | 	 		  on run
 
   set zeile to first paragraph of (do shell script "perl -e " & (quoted form of "
 
      $_= shift;
 
      s:\\.[^./]+$::;
 
      my(@x)= split /_/;
 
      print join(qq(\\t),@x[0..2],join(' ',@x[3..$#x]))
 
   ") & " " & (quoted form of "2011_H_ABC-123_Hier_steht_Text.pdf"))
 
end run
 
 | 	 
  _________________ "All problems are solved in slightly less than half an hour" (Chumbawamba, "Hey Hey We're The Junkies") | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		kipp •-->
  
 
  Anmeldedatum: 27.03.2007 Beiträge: 73 Wohnort: Göttingen
  | 
		
			
				 Verfasst am: 18.07.2011 - 09:43    Titel: -/?/..?? | 
				     | 
			 
			
				
  | 
			 
			
				Hallo Skeeve,
 
 
krasses Skript - vor allem die Perl-Version frand ich sehr beeindruckend! Frage mich nur, wie man darauf kommt, so viele Sonderzeichen wild zu kombinieren und zu hoffen, dass der Rechner was damit anfangen kann. Als Perl-Unkundiger frage ich mich unwillkürlich, wie lange ein Zufallsgenerator da laufen muss, bis ein gescheites Programm dabei herauskommt!
 
 
Ich bleibe doch lieber bei der Applescript-Variante. Die hat den Vorteil, dass die Elemente auch einzeln angesprochen und ggf. noch verändert werden können.
 
 
Dein Beitrag hat mir sehr geholfen! Herzlichen Dank dafür!
 
>>> kipp :-) | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
  | 
   
 
  
Powered by phpBB  © 2001, 2002 phpBB Group Deutsche Übersetzung von phpBB.de 
		 | 
	 
 
 | 
 
 |