hilfdirselbst.ch
Facebook Twitter gamper-media
Mac OS X enthält verschiedene integrierte Werkzeuge und Technologien, mit denen sich gängige Aufgaben schnell und einfach automatisieren lassen.
Anonym
Beiträge: 22827
15. Mär 2004, 13:30
Beitrag #1 von 9
Bewertung:
(3050 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen & ersetzen


Hallo,

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
 
end tell

Gruß Michael Top
 
X
Hans Haesler  M  p
Beiträge: 5432
15. Mär 2004, 14:14
Beitrag #2 von 9
Beitrag ID: #418674
Bewertung:
(3049 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen & ersetzen


Hallo Michael,

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.

Hans Haesler <hsa@ringier.ch>
als Antwort auf: [#418673] Top
 
Anonym
Beiträge: 22827
15. Mär 2004, 14:47
Beitrag #3 von 9
Beitrag ID: #418675
Bewertung:
(3049 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen & ersetzen


Hallo Hans,

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 :-(

Gruß
Michael
als Antwort auf: [#418673] Top
 
Hans Haesler  M  p
Beiträge: 5432
15. Mär 2004, 15:28
Beitrag #4 von 9
Beitrag ID: #418676
Bewertung:
(3049 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen & ersetzen


Hallo Michael,

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 &#133;

Hans Haesler <hsa@ringier.ch>
als Antwort auf: [#418673] Top
 
Anonym
Beiträge: 22827
15. Mär 2004, 17:48
Beitrag #5 von 9
Beitrag ID: #418677
Bewertung:
(3049 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen & ersetzen


Hallo Hans,

also wenn du darauf bestehst... schicke ich dir die Daten an hsa@ringier.ch


Viele Grüße aus dem sonnigen München
als Antwort auf: [#418673] Top
 
Hans Haesler  M  p
Beiträge: 5432
16. Mär 2004, 21:57
Beitrag #6 von 9
Beitrag ID: #418678
Bewertung:
(3049 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen & ersetzen


Hallo Michael,

also &#133; 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:
Code
Ad<\h>re<\h>na<\h>li<\h>nin<\h>jek<\h>tio<\h>nen

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 &#133;

Ü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.

Hans Haesler <hsa@ringier.ch>
als Antwort auf: [#418673] Top
 
Anonym
Beiträge: 22827
16. Mär 2004, 22:14
Beitrag #7 von 9
Beitrag ID: #418679
Bewertung:
(3049 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen & ersetzen


Hallo Hans,

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.

Gruß Michael
als Antwort auf: [#418673] Top
 
Hans Haesler  M  p
Beiträge: 5432
17. Mär 2004, 08:07
Beitrag #8 von 9
Beitrag ID: #418680
Bewertung:
(3049 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen & ersetzen


Hallo Michael,

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 &#133; 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.

Hans Haesler <hsa@ringier.ch>
als Antwort auf: [#418673] Top
 
Hans Haesler  M  p
Beiträge: 5432
18. Mär 2004, 22:29
Beitrag #9 von 9
Beitrag ID: #418681
Bewertung:
(3049 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Suchen & ersetzen


Hallo Michael,

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.

Hans Haesler <hsa@ringier.ch>
als Antwort auf: [#418673] Top
 
X