weiß jemand, wie ich in Quark oder Word (oder ???) per Applescript froße Mengen an Ersetzungen vornehmen kann? Der zu durchsuchende Text ist als xtags Datei ca 120KB groß. Die Ersetzungspärchen liegen zZ als Textdatei in folgendem Format vor: alter Text=neuer Text
wobei sowohl vor als auch nach dem = mal ein oder meherer Wörter stehen.
Hans hat hier schon einmal etwas zum Ersetzen gepostet, aber da wurde der Urspringstext in eine Variable eingelesen. Auf grund der Größe müßte das erst in mehere Teilen passieren. Mir reicht eigentlich schon so etwas wie: suche nach text XY und ersetze durch Text ab. Wo und in welchem Programm das passiert, ist eigentlich Nebensache. Hauptsache es klappt :-)
Hier mein Ansatz, nur das myReplace muß icui jetzt noch mit Leben füllen. Während ich auf eine Antwort warte, versuche ich jetzt erstmal Word zum Ersetzten zu überreden :-)
on myReplace(inText, outText) tell application "Microsoft Word"
end ell end myReplace
tell application "Finder"
set oldDelims to AppleScript's text item delimiters set AppleScript's text item delimiters to "="
set filePath to (choose file with prompt "Eine Ersetzungsdatei auswählen" of type "TEXT") set fileID to open for access filePath
try repeat set myLine to (read fileID until ASCII character 13)
set orgText to text item 1 of myLine set repText to text item 2 of myLine
log (orgText & "•" & repText) myReplace(orgText, repText) of me --write ((ASCII number i) & return) as text to outFile end repeat end try
close access fileID set AppleScript's text item delimiters to oldDelims
endlich ein Thema, bei welchem ich mich auskenne :-).
Also … wenn schon ein Programm dazu verwenden, dann "BBEdit". Ja nicht "Word". Und den Finder brauchen wir auch nicht.
"BBEdit" ist sehr leistungsfähig, aber wenn es per Script angesprochen werden soll, dann muss man unter Mac OS 9 die kostenplichtige 6.1.2-Version verwenden. Aber man kann auch auf BBEdit verzichten. Es reicht, ein Script zu schreiben und zum Suchen/Ersetzen eine Scripting Addition zu verwenden. Unter Mac OS 9.x gibt es "RegEx Commands" oder "Satimage". Unter Mac OS X "Satimage.osax". Beide sind Freeware.
Obwohl sie im Grunde die gleichen RegExp-Aktionen ausführen, sind die Befehle der beiden Scripting Additions unterschiedlich. Deshalb sollte ich wissen, für welches Mac OS Du das Script einsetzen möchtest.
Weiter: könntest Du mir bitte eine XTags-Datei und eine Datei mit den Ersetzungspärchen zustellen? Dann könnte ich gezielt eine Lösung produzieren.
diesmal war ich schneller, nur nicht beim Antwort posten :-(
IDa ich auch keine wirklicher Freund von Word bin, habe auch ich nach einer Alternative gesucht und bin bei Text Edit Plus gelandet. Den gibt es sowohl für OS 9 und X und ist wie BBEdit scriptfähig.
Hier also meie Lösung:Einfach den Handleraufruf myReplace() durch tell application "Tex-Edit Plus" select window 1 replace window 1 looking for orgText replacing with repText --replace window 1 looking for orgText replacing with repText with cases matching and whole words matching end tell
ersetzten und fertig :-)
Also nocheinmal vielen Dank an dich Hans für deine schnelle Antwort. Da ich ja aufgrund früherer Posts von dir damit gerechnet habe, das du mit RexEx kommen wirst (mächtig, aber mus man auch erstmal verstehen :-)) ) Habe ich mich mit TextEdit beholfen. Ich denke, das sieht auch recht einfach aus; zumindest für mich, der (viel zu selten) solche Probleme lösen muß/darf und sich daher nicht ganz so doll in AS auskennt :-(
bitteschön. Deine Berührungsängste gegenüber RegEx sind verständlich. Aber wenn man mal das Prinzip verstanden hat, dann ist das Ding nicht mehr so fremd. Und der Vorteil ist, dass die Dateien im Hintergrund behandelt werden. Sie müssen nicht in einem Fenster angezeigt werden. Und ich nehme an, dass die Performance schon allein aus diesem Grunde besser sein wird.
Deshalb würde ich gerne für Dich eine (kommentierte) RegEx-Lösung entwickeln. Wenn Du mir also bitte die Beispielfiles senden würdest, damit ich mit dem "real stuff" üben kann …
also … da komme ich nicht mehr mit. Hast Du wirklich erfolgreich mit "Tex-Edit-Plus" das Suchen/Ersetzen durchgeführt? Und zwar in der XTags-Datei, welche Du mir zugestellt hast?
Der ganze Text ist ja gespickt mit optionalen Trennungen im XPress-Tags-Format (= <\h>) und das sieht so aus: Huch!!! In der ASCII-Datei kann ein solches Wort nur gefunden werden, wenn der Suchstring auch so "aufbereitet" wird. Auch mit einfacheren, wie zum Beispiel mit "Chap<\h>ter", welches durch das deutsche "Kapitel" ersetzt werden soll, wird es nicht klappen.
Achtung Falle: Da soll "See also" durch "Siehe auch" ersetzt werden. Aber da gibt es auch eine Stilvorlage, welche so heisst. Zwar kein eigentliches Problem, weil in der Datei ja auch die Definition der Stilvorlage steht und ebenfalls umbenannt werden wird.
Aber in einem anderen Fall geht es bestimmt schief, wenn nicht die Reihenfolge umgekehrt wird: Zuerst "Disorders of the heart" suchen und ersetzen, bevor das einfache "Disorders" behandelt wird …
Übrigens: Wenn der Text in ein XPress-Dokument importiert wird (Checkbox "Einschließlich Stilvorlagen" aktiviert), dann stören die optionalen Trennungen den Suchen-/Ersetzen-Vorgang nicht. Die Textketten können alle gefunden und ersetzt werden. Allerdings wird es mit XPress 6 ein Weilchen dauern.
ich habe natürlich erstmal alle <\h> durch nix ersetzt. Das aber mit TextEdit :-)) Die Firma, von der dieses Problem stammt, verwendet irgendeine xtension, die automatisch weiche Trennungen einbaut. Die stören natürlich bei der Ersetzung. Also werden sie gnadenlos ersetzt/gelöscht. Mann kann ja nicht alles haben. Außer du schaftst selbst das mit regex.Aber damit habe ich mich abgefunden.
ach soooo... Mit RegEx schafft man das leicht: --- set aString to "Ad<\\h>re<\\h>na<\\h>li<\\h>nin<\\h>jek<\\h>tio<\\h>nen" set aString to change "<\\h>" into "" in aString -->"Adrenalininjektionen"
Die Backslashes (= \) sind verdoppelt, weil dieses Zeichen in AppleScript ein Sonderzeichen ist und durch einen … Backslash deaktiviert werden muss.
Dieses Snippet benötigt die Scripting Addition "Satimage". Getestet unter Mac OS 9.2.1. Aber unter Mac OS X wird der Befehl genau gleich lauten. Ich werde gelegentlich versuchen, für Deine Aufgabe ein OSX-Droplet zu entwickeln.
entschuldige bitte die Verzögerung. Ich war am Mittwoch sehr beschäftigt und heute den ganzen Tag abwesend. Aber soeben habe ich das fertige Suchen/Ersetzen-Droplet an Dich gesandt.
Es funktioniert unter Mac OS X 10.3.2 und benötigt die Scripting Addition "Satimage.osax". Die Anwendung: eine (oder mehrere) XPress-Tags-Dateien auf das Icon des Droplets ziehen, im Dialog eine Konvertertabellen-Datei selektionieren und auf "Auswählen" klicken.
Trotzdem Deine Beispieldatei recht viel wiegt (169'683 Zeichen), ist der Spuk vorbei, bevor Du "Suchen/Ersetzen" sagen kannst. :-) Die 14'925 (sic!) optionale Trennungstags werden weggeputzt, eventuelle mehrfache Zwischenräume durch einen ersetzt und die 13 Suchen-/Ersetzen-Paare werden der Reihe nach durchgenommen.
Hier das Kernstück des Scripts. Die zu behandelnde XPress-Tags-Datei wird in die Variable 'aString' eingelesen. Die vom Anwender ausgewählte Konvertertabellendatei in die Variable 'convFile'. In den drei folgenden Handlern sagen die eingefügten Kommentare eigentlich alles. --- on stripSpaces() -- zwei (oder mehr) Zwischenräume durch einen einzigen ersetzen set aString to change " +" into " " in aString with regexp end stripSpaces
on stripHyph() -- die optionalen Trennungs-Tags rausschmeissen set aString to change "<\\h>" into "" in aString end stripHyph
on searchReplace() -- mit einer Repeatschleife die Absätze der Konvertertabellen-Datei durchgehen repeat with i from 1 to count of paragraphs of convFile try -- den aktuellen Absatz in die Variable 'curPara' geben set curPara to paragraph i of convFile -- die Position des "="-Zeichens feststellen set equalPos to item 1 of (matchPos of (find text "=" in curPara) as list) -- den Suchstring, basierend auf der Position von "=" in die Variable 'searchStr' geben set searchStr to (text 1 thru equalPos) of curPara -- den Ersetzenstring, basierend auf der Position von "=" in die Variable 'replaceStr' geben set replaceStr to text (equalPos + 2) thru -1 of curPara -- in der Variable das Suchen/Ersetzen vornehmen set aString to change searchStr into replaceStr in aString end try end repeat end searchReplace --- Von wegen RegExp: nur der erste Befehl, welcher die Zwischenräume reduziert, ist ein eigentlicher Regular-Expressions-Befehl, weil bei den weiteren die "buchstäblichen" Textketten angesprochen werden.