Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
giesskanne •->

Anmeldedatum: 18.11.2004 Beiträge: 17
|
Verfasst am: 18.11.2004 - 13:34 Titel: Leerzeichen zw. Wörtern selektieren und durch "_" |
|
|
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 |
|
 |
Folker •---->


Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 18.11.2004 - 13:52 Titel: |
|
|
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 |
|
 |
giesskanne •->

Anmeldedatum: 18.11.2004 Beiträge: 17
|
Verfasst am: 18.11.2004 - 16:11 Titel: |
|
|
Hallo Folker,
das sieht klasse aus und macht, was es tun soll.
Raffiniert.
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 |
|
 |
Folker •---->


Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 18.11.2004 - 16:50 Titel: |
|
|
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
--© 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 >
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 |
|
 |
giesskanne •->

Anmeldedatum: 18.11.2004 Beiträge: 17
|
Verfasst am: 18.11.2004 - 16:57 Titel: |
|
|
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 |
|
 |
Folker •---->


Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 18.11.2004 - 17:16 Titel: |
|
|
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
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
Die Funktionsweise, insbesondere was den Zeichentausch angeht, sollte klar sein. _________________ Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign |
|
Nach oben |
|
 |
giesskanne •->

Anmeldedatum: 18.11.2004 Beiträge: 17
|
Verfasst am: 19.11.2004 - 01:59 Titel: |
|
|
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.
Martin |
|
Nach oben |
|
 |
giesskanne •->

Anmeldedatum: 18.11.2004 Beiträge: 17
|
Verfasst am: 19.11.2004 - 13:32 Titel: |
|
|
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 |
|
 |
Snow Administrator


Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 19.11.2004 - 14:52 Titel: |
|
|
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 |
|
 |
giesskanne •->

Anmeldedatum: 18.11.2004 Beiträge: 17
|
Verfasst am: 19.11.2004 - 15:31 Titel: |
|
|
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 |
|
 |
Folker •---->


Anmeldedatum: 11.12.2000 Beiträge: 649 Wohnort: Holsteinische Schweiz
|
Verfasst am: 20.11.2004 - 12:33 Titel: |
|
|
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  _________________ Gruß,
Folker Brandt
=============================
Systemberatung · Datenbanken · Webdesign |
|
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
|