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

Leerzeichen zw. Wörtern selektieren und durch "_"

 
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
giesskanne
•->
•->


Anmeldedatum: 18.11.2004
Beiträge: 17

BeitragVerfasst am: 18.11.2004 - 13:34    Titel: Leerzeichen zw. Wörtern selektieren und durch "_" Antworten mit Zitat

Hallo,

es sollte eigentlich ganz einfach sein, aber ich mach schon gut ne Stunde dran rum:

Ich möchte zwischen Wörtern das Leerzeichen durch einen Underscore (_) ersetzen. Mein Versuch:

Code:

set myWords to "Ich bin frustriert"
set myCharacters to characters of myWords
set mySel to characters of myWord whose contents is " "

Später soll dann so etwas wie diese Zeile rein:
Code:

set contents of mySel to "_"


Aber ich scheitere eben schon am
'set mySel to characters of myWord whose contents is " "'

Hab's auch mit "items" und "text items" statt "characters" versucht.

Ich schäme mich fast, so was hier zu posten, aber ich stehe wirklich ziemlich auf dem Schlauch.

Ciao Martin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Folker
•---->
•---->


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 18.11.2004 - 13:52    Titel: Antworten mit Zitat

Moin,

könnte dies der Ansatz sein?

set theTextString to "eins zwei drei vier fünf"
set theL to every word of theTextString
set {theOldDelim, AppleScript's text item delimiters} to {AppleScript's text item delimiters, {"_"} }
set theTextString to theL as string
set AppleScript's text item delimiters to theOldDelim
get theTextString

Leider nur auf OS X getestet (AS-Version "D1-1.9.3")
_________________
Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
giesskanne
•->
•->


Anmeldedatum: 18.11.2004
Beiträge: 17

BeitragVerfasst am: 18.11.2004 - 16:11    Titel: Antworten mit Zitat

Hallo Folker,

das sieht klasse aus und macht, was es tun soll.
Raffiniert. Wink
Herzlichen Dank.

Aber wenn wir schon dabei sind ...
hast Du auch eine Lösung für das Ersetzen anderer Zeichen als dem Leerzeichen (also "ss" statt "ß" oder "ae" satt "ä")?


Martin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Folker
•---->
•---->


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 18.11.2004 - 16:50    Titel: Antworten mit Zitat

Ja - habe da mal fix ein altes Script rausgesucht - kann als Programm abgespeichert werden - ob es allerdings unter allen AS-Versionen ohne kleinere Anpassungen läuft vermag ich nicht zu sagen (habe eben noch fürs 10er OS 'ne kleine Anpassung vorgenommen, bei mir lief der Test gut. Du musst halt schauen, was Du benötigst, aber eigentlich sollte anhand des Scriptes die Vorgehensweise klar werden ... (sonst fragen Smile


--© Folker Brandt 2001-2004
-- getestet mit AS 1.9.3 , Mac OS X 10.3.6
(*Version mit Sonderzeichen! Kann auch für andere Späße gebraucht werden siehe auch < nicht mehr online da OS 9 Krempel Wink>
Weitere Möglichkeit wäre es gewesen, mathematisch ranzugehen also 'ASCII character ((ASCII number A) + 32)' -> a - aber da haben wir
mit Sonderzeichen o.ä. Probleme. Untere Lösung läßt sich auch für andere Sonderzeichen verwenden - einfach die properties the_oldChar und the_newChar anpassen
*)
property the_oldChar : {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "Ä", "Ö", "Ü", "ß", "ä", "ö", "ü", " "} (* hier werden dann auch kleine Sonderzeichen berücksichtigt - deshalb nochmal ä,ö,ü am Ende der Liste - diese Liste ließe sich noch für weitere Sonderzeichen erweitern - allerdings müssen dann immer der Groß- und der Kleinbuchstabe als einzelnes List-Item berücksichtigt werden und in der Liste the_newChar doppelt aufgeführt sein. Auch alle weiteren Sonderzeichen lassen sich so bereinigen - aber stelle sicher, dass item x of the_oldChar immer mit item y of the_newChar korrespondiert - das die Listen gleiche Länge (Anzahl items) haben müssen versteht sich von selbst *)

property the_newChar : {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "ae", "oe", "ue", "ss", "ae", "oe", "ue", "_"}

(* Bei zu langen Dateinamen wg. ä,ö,ü,ß Umsetzung, siehe Handler get_newName(DerString) im unteren Teil, wird der Property the_Fuellsel benötigt.
Bei zu langen Namen (> 31 characters) wird der Dateiname wird nach dem Schema "erste 10 Zeichen & the_Fuellsel & letzte 20 Zeichen" aufgebaut
*)
property the_Fuellsel : "…"
property the_Zaehler : 0

on run -- Doppelklick
   try
      set the_Fold to (choose folder with prompt "Ordner auswählen:")
      set the_Zaehler to 0
      do_Job(the_Fold as string)
      the_Meldung()
   on error errmsg number num
      if not (num = -128) then theerror(errmsg, num)
   end try
end run

on open these_items -- drag and drop
   try
      set the_Zaehler to 0
      if class of these_items is not list then set these_items to {these_items}
      repeat with i from 1 to (count items of these_items)
         set temp to (info for item i of these_items)
         if (folder of temp) and not (package folder of temp) then
            --Ordner gefunden
            do_Job((item i of these_items) as string)
         else
            -- kein Ordner, Datei!
            tell application "Finder"
               set the_Fold to folder of (item i of these_items)
            end tell
            set_newName(name of temp, the_Fold as string)
         end if
      end repeat
      the_Meldung()
   on error errmsg number num
      theerror(errmsg, num)
   end try
end open

on theerror(errmsg, num)
   activate
   beep
   set AppleScript's text item delimiters to {""}
   display dialog errmsg buttons {"Aargh…"} default button 1 with icon 0
end theerror

on the_Meldung() -- Dateien im Ordner umbenannt
   activate
   beep
   display dialog ((the_Zaehler as string) & " Dateien bearbeitet!") buttons {"Danke"} default button 1 with icon 401
end the_Meldung

on do_Job(the_Fold) -- hier werden einzelne Ordner abgearbeitet
   activate
   -- Dateien auflisten OHNE invisibles! (wenn auch die gewünscht, einfach vor 'without' auskommentieren (--)
   set the_FolderList to list folder the_Fold without invisibles
   -- Zähler für die Anzahl berücksichtigter Dateien eines Ordners
   -- Schleife durch einen Ordner
   repeat with i in the_FolderList
      set temp to (info for ((the_Fold & ":" & (i as string)) as alias))
      if (folder of temp) and not (package folder of temp) then
         do_Job(the_Fold & (i as string) & ":")
      else
         set_newName(i, the_Fold)
         -- Zähler um 1 heraufsetzen
      end if
   end repeat
   -- wenn mehrere Ordner (drag and drop) bearbeitet werden den Zähler eines Ordners merken
end do_Job

on set_newName(i, the_Fold)
   -- Datei umbenennen
   tell application "Finder"
      set name of file (the_Fold & (i as string) as alias) to (get_newName(i as string) of me)
   end tell
   set the_Zaehler to (the_Zaehler + 1)
end set_newName

--Dateinamen auf Kleinbuchstaben umsetzen
on get_newName(DerString)
   set {oldDelims, AppleScript's text item delimiters} to {AppleScript's text item delimiters, {""}}
   considering case, white space, diacriticals, hyphens, expansion and punctuation
      repeat with i from 1 to (count items of the_oldChar)
         if (item i of the_oldChar is in DerString) then
            set AppleScript's text item delimiters to {item i of the_oldChar}
            set DerString to (text items of DerString)
            set AppleScript's text item delimiters to {item i of the_newChar}
            set DerString to (DerString as string)
         end if
      end repeat
   end considering
   
   --Prüfung der Dateinamenlänge wg. Zeichenverdoppelung wg der Umsetzung von ä,ö,ü,ß
   -- Die Prüfung kann auskommentieren werden wenn keine Zeichenverdopplung stattfindet (siehe property the_Fuellsel)
   if (count text items of DerString) > 31 then
      set {oldDelims, AppleScript's text item delimiters} to {AppleScript's text item delimiters, {""}}
      set DerString to (text items 1 thru 10 of DerString & the_Fuellsel & text items -1 thru -20 of DerString) as string
      set AppleScript's text item delimiters to oldDelims
   end if
   -- bis hier kann auskommentiert werden
   
   set AppleScript's text item delimiters to oldDelims
   return DerString
end get_newName

_________________
Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign


Zuletzt bearbeitet von Folker am 21.11.2004 - 12:29, insgesamt 9-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
giesskanne
•->
•->


Anmeldedatum: 18.11.2004
Beiträge: 17

BeitragVerfasst am: 18.11.2004 - 16:57    Titel: Antworten mit Zitat

Hallo Folker,

jetzt hast Du mich geradezu erschlagen.

Aber bevor ich anfange, das Skript zu verstehen, bleißt sich der Compiler an der Zeile "if class of these_items ? list then set these_items to {these_items}" fest.
Hast Du ne Idee, was das Fragezeigen da zu suchen hat?

Martin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Folker
•---->
•---->


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 18.11.2004 - 17:16    Titel: Antworten mit Zitat

Ja, das soll ein "Ungleich" sein (is not)

Da ist aber irgendwie ein Wurm in der Rekursion - war damals ein Hack in der Mittagspause (war wahrscheinlich nicht wirklich vorgesehen Smile

Das bastel ich aber gerade um ...


Nachtrag - (20:30 Uhr): Das erste Script habe ich direkt im oberen Posting geändert - es kann jetzt auch Rekursion - erhebt aber keinen Anspruch auf Perfektion! Auch mag die ein oder andere Formulierung einer anderen AS-Version sauer aufstoßen - ich habe das jetzt mit AS 1.9.3 unter OS 10.3.6 getestet. Da klappt jetzt nach einiger Überarbeitung eigentlich alles in dem Script aus seligen OS 9 Zeiten. Sollte trotzdem ein Fehler drin sein, bitte posten Smile
Die Funktionsweise, insbesondere was den Zeichentausch angeht, sollte klar sein.
_________________
Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
giesskanne
•->
•->


Anmeldedatum: 18.11.2004
Beiträge: 17

BeitragVerfasst am: 19.11.2004 - 01:59    Titel: Antworten mit Zitat

Hallo Folker,

hab' Dein Script für meine Zwecke etwas umgebaut.
Code:

property myOldChar : {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "Ä", "Ö", "Ü", "ß", "ä", "ö", "ü", " "}
property myNewChar : {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "ae", "oe", "ue", "ss", "ae", "oe", "ue", "_"}

set myString to "Weiß der Teufel, was in der Hölle los ist."
set myNewString to get_newName(myString)

on get_newName(theString)
   set {oldDelims, AppleScript's text item delimiters} to {AppleScript's text item delimiters, {""}}
   considering case, white space, diacriticals, hyphens, expansion and punctuation
      repeat with i from 1 to (count items of myOldChar)
         if (item i of myOldChar is in theString) then
            set AppleScript's text item delimiters to {item i of myOldChar}
            set theString to (text items of theString)
            set AppleScript's text item delimiters to {item i of myNewChar}
            set theString to theString as string
         end if
      end repeat
   end considering   
   set AppleScript's text item delimiters to oldDelims
   return theString
end get_newName

Die Geschichte mit den "text item delimiters" fand ich spannend.

Meine frühere Alternative (Schleifenmethode) wird bei längeren strings ziemlich langsam:
Code:

set myOldString to characters of "Weiß der Teufel, was in der Hölle los ist."
set myOldChar to {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "Ä", "Ö", "Ü", "ß", "ä", "ö", "ü", " "}
set myNewChar to {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "ae", "oe", "ue", "ss", "ae", "oe", "ue", "_"}
repeat with myOldCharCount from 1 to length of myOldChar
   repeat with i from length of myOldString to 1 by -1
      tell myOldString
         if item i is item myOldCharCount of myOldChar then
            set item i to item myOldCharCount of myNewChar
         end if
      end tell
   end repeat
end repeat
set myNewString to myOldString as string


Danke für Deine Unterstützung.
Die Sache mit den delimiters werde ich mir merken. Wink

Martin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
giesskanne
•->
•->


Anmeldedatum: 18.11.2004
Beiträge: 17

BeitragVerfasst am: 19.11.2004 - 13:32    Titel: Antworten mit Zitat

Hallo Folker,

hab noch etwas wesentlich Einfacheres entdeckt:

Code:

set myOldString to "Weiß der Teufel, was in der Hölle los ist."
set myOldChar to {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "Ä", "Ö", "Ü", "ß", "ä", "ö", "ü", " "}
set myNewChar to {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "ae", "oe", "ue", "ss", "ae", "oe", "ue", "_"}
set myNewString to myOldString

repeat with myCounter from (length of myOldChar) to 1 by -1
   set mySearchChar to (item myCounter of myOldChar)
   set myReplaceChar to (item myCounter of myNewChar)
   set myNewString to change mySearchChar into myReplaceChar in myNewString as string
end repeat


Warum bin ich da nicht schon früher draufgekommen?
Wahrscheinlich gibt's noch einiges zu verbessern, aber mir gefällt die change-Methode jetzt auch nicht schlecht.

Martin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1946
Wohnort: Deiningen

BeitragVerfasst am: 19.11.2004 - 14:52    Titel: Antworten mit Zitat

Hallo Martin,

wenn du mit 'change' arbeitest, brauchst du die Satimage-OSAX. Anscheinend hast du die ja installiert. Dann kann man zum Umsetzten der Dateinamen in Kleinbuchstaben aber auch schon den Befehl 'lowercase' benutzen und braucht dann danach nur noch die Leerzeichen durch den Unterstricht per 'change' ersetzen.
_________________
Peter
-
Fischer-Bayern.de|Shadetreemicro.com
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
giesskanne
•->
•->


Anmeldedatum: 18.11.2004
Beiträge: 17

BeitragVerfasst am: 19.11.2004 - 15:31    Titel: Antworten mit Zitat

Hallo Peter,

in der Tat habe ich mir heute das Satimage-OSAX installiert und angeschaut. Glaubte es auch deinstalliert zu haben, als ich prüfte, ob der change-Befehl in seiner einfachen Verwendung ein Bordmittel von AppleScript ist.

Entweder war die Satimage-OSAX noch im Arbeitsspeicher geladen (ist das möglich) ode sie war nicht richtig deinstalliert.

By the way:
Ich habe Dein Script OAXen installieren ausprobiert.
Die Zeile
Code:
property tC_list : {MT Digit String 123 digit 2, uppercase "abc", the ticks}

erzeugt bei mir die Fehlermeldung
Code:
Expected “, ” or “}” but found identifier.


Hast Du ne Idee, woran das liegt?

Martin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Folker
•---->
•---->


Anmeldedatum: 11.12.2000
Beiträge: 649
Wohnort: Holsteinische Schweiz

BeitragVerfasst am: 20.11.2004 - 12:33    Titel: Antworten mit Zitat

Hallo Martin,

ja, zum change-Befehl hat Peter ja schon was geschrieben. I.d.R. versuche ich immer, wo möglich, auf "Fremd"-Scripting Additions zu verzichten. Allerdings verwende ich seit Jahren auch den Editor Smile und habe immer die Satimage-Addition auf dem Rechner installiert. Mittlerweile ist Apples ScriptEditor richtig gut geworden - kein Vergleich zu früheren Versionen und so verwende ich Smile nur noch selten.

Ja, der im ersten Moment naheliegende Weg (Deine Schleifenmethode) ist natürlich erheblich langsamer als der Weg über die text item delimiters, allerdings kann man sich da auch Probleme einhandeln. Bei zu langen strings (ca. 4000 Zeichen) erhält man, zumindest war das früher so, einen "Stack overflow".

@Snow

dufte, der Code Formatter braucht ja gar kein Tex-Edit mehr! Das ist super, denn neben BBEdit und TextEdit braucht es nicht wirklich noch einen weiteren Text Editor - 10 $ gespart Smile
_________________
Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
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