Fischer-Bayern.de
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Dateinamen prüfen, Dateien kopieren via Droplet

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Fischer-Bayern.de Foren-Übersicht -> AppleScript-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
JK
•->
•->


Anmeldedatum: 28.11.2010
Beiträge: 1

BeitragVerfasst am: 28.11.2010 - 19:02    Titel: Dateinamen prüfen, Dateien kopieren via Droplet Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
woodpecker
•--->
•--->


Anmeldedatum: 12.10.2010
Beiträge: 150
Wohnort: Roggentin/Rostock

BeitragVerfasst am: 29.11.2010 - 18:15    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 30.11.2010 - 22:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
kipp
•-->
•-->


Anmeldedatum: 27.03.2007
Beiträge: 73
Wohnort: Göttingen

BeitragVerfasst am: 13.07.2011 - 00:05    Titel: Super Script Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 13.07.2011 - 18:18    Titel: Re: Super Script Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
kipp
•-->
•-->


Anmeldedatum: 27.03.2007
Beiträge: 73
Wohnort: Göttingen

BeitragVerfasst am: 16.07.2011 - 12:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 16.07.2011 - 22:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skeeve
•---->
•---->


Anmeldedatum: 20.04.2006
Beiträge: 1068

BeitragVerfasst am: 16.07.2011 - 22:20    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
kipp
•-->
•-->


Anmeldedatum: 27.03.2007
Beiträge: 73
Wohnort: Göttingen

BeitragVerfasst am: 18.07.2011 - 09:43    Titel: -/?/..?? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Fischer-Bayern.de Foren-Übersicht -> AppleScript-Forum Alle Zeiten sind GMT + 2 Stunden
Seite 1 von 1

 
Gehe zu:  
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


AppleScript für absolute Starter