Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
JK •->
![•-> •->](/phpBB2/images/ranks/ranki0.gif)
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 |
|
![](templates/subSilver/images/spacer.gif) |
woodpecker •--->
![•---> •--->](/phpBB2/images/ranks/ranki2.gif)
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 |
|
![](templates/subSilver/images/spacer.gif) |
Skeeve •---->
![•----> •---->](/phpBB2/images/ranks/ranki3.gif)
![](images/avatars/109842322644abb04db262b.gif)
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 |
|
![](templates/subSilver/images/spacer.gif) |
kipp •-->
![•--> •-->](/phpBB2/images/ranks/ranki1.gif)
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 |
|
![](templates/subSilver/images/spacer.gif) |
Skeeve •---->
![•----> •---->](/phpBB2/images/ranks/ranki3.gif)
![](images/avatars/109842322644abb04db262b.gif)
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 |
|
![](templates/subSilver/images/spacer.gif) |
kipp •-->
![•--> •-->](/phpBB2/images/ranks/ranki1.gif)
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 |
|
![](templates/subSilver/images/spacer.gif) |
Skeeve •---->
![•----> •---->](/phpBB2/images/ranks/ranki3.gif)
![](images/avatars/109842322644abb04db262b.gif)
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 |
|
![](templates/subSilver/images/spacer.gif) |
Skeeve •---->
![•----> •---->](/phpBB2/images/ranks/ranki3.gif)
![](images/avatars/109842322644abb04db262b.gif)
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 |
|
![](templates/subSilver/images/spacer.gif) |
kipp •-->
![•--> •-->](/phpBB2/images/ranks/ranki1.gif)
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 |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|
|
|