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

Anmeldedatum: 04.12.2003 Beiträge: 2
|
Verfasst am: 10.12.2003 - 22:06 Titel: string in mehreren datein suchen |
|
|
Hallo,
ich möchte in mehreren EPS-Dateien nach einem betimmten String suchen. Mein Script erzeugt einen Stack Overflow (wahrscheinlich durch die vielen character-Zugriffe und deren Verbindung mit &). Abgesehen davon erscheint mir meine Lösung als äußerst unelegant (das komplette Skript habe ich weiter unten angefügt).
Ein besserer Ansatzpunkt wäre sicherlich etwas in der Art wie:
read Dateireferenz before FindeDiesesWort
Ich bin damit aber bis jetzt nicht viel weitergekommen. Das Script sollte mindestens 100 Dateien problemlos (also ohne Overflow) verkraften. Der gesuchte String ("BeginAGDEm") im untenstehenden Beispiel wird z.B. bei allen Freehand-EPS verwendet.
Viele Grüße
Andreas
und hier das Script:
property ZielOrdner : "" -- ZielOrdner Parameter definieren bzw. zurücksetzen
property QuellOrdner : "" -- QuellOrdner Parameter definieren bzw. zurücksetzen
on run
set QuellOrdner to choose folder with prompt "Quellordner wählen"
tell application "Finder"
set DateiListe to every file of folder QuellOrdner
if DateiListe = {} then
display dialog ("Es sind keine Dateien vorhanden!!!" & return & "Programm wird abgebrochen.") buttons {"OK"} default button "Ok"
else
set ZielOrdner to choose folder with prompt "Zielordner wählen"
repeat with dieDatei in DateiListe
my WortSuchen(dieDatei) -- der Handler, s.u.
end repeat
end if
end tell
end run
on WortSuchen(dieDatei)
set AnzahlDerWoerter to 50 -- Anzahl der abgefragten Strings, schlechte Lösung
set WortGefunden to false
set FindeDiesesWort to "BeginAGDEm" -- nach diesem String wird gesucht
try
set Dateireferenz to (open for access dieDatei)
on error
beep
end try
repeat with i from 1 to AnzahlDerWoerter -- schlechte Lösung, nur zum Testen, besser wäre etwas wie read Dateireferenz before FindeDiesesWort
copy (read Dateireferenz until "%%") to Wort -- die Strings werden durch %% getrennt
if (number of characters in Wort > 10) then -- alle Strings mit mehr als 10 Zeichen
set Suchwort to ""
repeat with i from 1 to 10
set Suchwort to (Suchwort & (character i of Wort))
end repeat
set Anzeige to Suchwort
log the result
if Suchwort = FindeDiesesWort then
set WortGefunden to true
beep 1
end if
end if
end repeat
-- Anfang Datei verschieben
if WortGefunden is true then
tell application "Finder"
move dieDatei to ZielOrdner
end tell
else
-- display dialog "fertig!" & return & return & ¬
-- "Wort nicht gefunden." & return & ¬
-- "" buttons "OK" default button 1
end if
-- Ende Datei verschieben
try
close access Dateireferenz
on error
beep 5
end try
end WortSuchen |
|
Nach oben |
|
 |
Raimo •-->


Anmeldedatum: 20.08.2003 Beiträge: 111
|
Verfasst am: 11.12.2003 - 08:50 Titel: |
|
|
wenn ich dir richtig verstanden haben werden die strings in der datei mit %% getrennt und kopierts hier den string einzeln raus und überprüfst ihn
copy (read Dateireferenz until "%%") to Wort -- die Strings werden durch %% getrennt
das hier ist eine bessere lösung (nur wenn ich dein vorhaben richtig interpretiert habe)
set altDelimiter to AppleScript's text item delimiters
set AppleScript's text item delimiters to "%%"
set WOERTERLISTE to every text item of (read Dateireferenz)
set AppleScript's text item delimiters to altDelimiter
dies trennt dir einen string z.B. "hallo%%ich%%bin%%ein%%string" und macht dir ein liste daraus {"hallo","ich","bin","ein","string"}
das kannst du dann gut in einer schleif durchlaufen
repeat with einWort in WOERTERLISTE
--was tun mit einWort
end repeat
hift dir das? _________________ http://home.tiscalinet.ch/wraimo/ |
|
Nach oben |
|
 |
Snow Administrator


Anmeldedatum: 21.11.2000 Beiträge: 1946 Wohnort: Deiningen
|
Verfasst am: 11.12.2003 - 20:12 Titel: |
|
|
Hallo Andreas,
mit read for xxx (wobei xxx für die Anzahl der Zeichen steht), kannst du die Datei häppchenweise einlesen und überprüfen.
Hier ein Beispiel-Skript:
set dieDatei to ((path to desktop) as string) & "Anzeige.eps"
set theSecs to " Sekunden"
try
set theRef to open for access file dieDatei
set exitFlag to false
set StartZeit to current date
repeat until exitFlag is true
set derText to read theRef for 10000 -- 10000 Zeichen
-- solange der Dateizugriff nicht geschlossen wird
-- mit "close access" liest das Skript bei jedem Schleifendurchlauf
-- an der letzten Position weiter
if derText contains "BeginAGDEm" then
set exitFlag to true
end if
set derText to ""
end repeat
set EndeZeit to current date
close access theRef
set LaufZeit to EndeZeit - StartZeit
if LaufZeit = 1 then set theSecs to " Sekunde"
display dialog "Bingo! Volltreffer!" & return & ¬
"Laufzeit des Skripts: " & LaufZeit & theSecs
on error errMsg
log errMsg
set EndeZeit to current date
close access theRef
set LaufZeit to EndeZeit - StartZeit
if LaufZeit = 1 then set theSecs to " Sekunde"
display dialog "Das Suchwort war nicht vorhanden." & return & ¬
"Laufzeit des Skripts: " & LaufZeit & theSecs
end try
Die Ermittlung der Skriptlaufzeit mag im ersten Moment als Spielerei erscheinen, aber sie soll helfen, den optimalen Wert für die Anzahl der zu lesenden Zeichen zu ermitteln.
Also bei 20.000 Zeichen bekomme ich gleich einen Fehler. Mit 15.000 hat es noch funktioniert.
Wenn du noch genauere Werte als Sekunden haben willst, brauchst du Jon's Commands. Dann kannst du "current date" durch "the ticks" ersetzen und bekommst dann als Ergebnis 60stel Sekunden.
Bei der Anzahl der zu lesenden Zeichen gilt allerdings noch folgendes zu beachten:
Je höher die Anzahl, desto schneller läuft das Skript
Wenn allerdings beim letzten Schleifendurchlauf die tatsächliche Anzahl der Zeichen bis zum Dateiende kleiner ist, als die eingestellte Anzahl, kommt es zu einem Fehler und das Skript wird beendet, wobei eben dieser letzte Rest der Datei nicht mehr untersucht wird.
Ich gehe aber mal davon aus, dass der gesuchte Begriff eher ziemlich am Anfang der Datei zu finden ist.
Darf man fragen, wozu das Skript dient?
So wie es bisher aussieht, werden ja alle Dateien, die den Begriff enthalten, in einen anderen Ordner verschoben. Du schreibst aber auch, dass alle Freehand EPS den Suchbegriff enthalten. Also wäre es doch evtl. einfacher, die Dateien auf Creator- und Filetype hin zu untersuchen, und die entsprechenden Dateien dann zu verschieben. _________________ Peter
-
Fischer-Bayern.de|Shadetreemicro.com |
|
Nach oben |
|
 |
andreas_koester •->

Anmeldedatum: 04.12.2003 Beiträge: 2
|
Verfasst am: 15.12.2003 - 22:33 Titel: |
|
|
Hallo Raimo, Hallo Snow,
@Raimo:
bei großen Dateien bleibt Dein Script hängen. Vielleicht habe ich auch irgendwas falsch gemacht. Verkraftet eine Liste auch mehrere MB?
@Snow:
das Script habe ich verstanden. Funktioniert hat´s bei mir nicht. Den Wert in Zeile
set derText to read theRef for 10000
habe ich mit 1000 bis 30000 ausprobiert und bekam dann im Event-Protokoll eine EOF-Meldung, obwohl die Test-Datei 30 KB belegt.
Egal. Dein Hinweis auf den File-Type war hilfreich. Eigentlich suche ich ja nur alle EPS-Dateien, die mit Freehand erzeugt wurden. Mit einer kombinierten Abfrage aus creator und type funktioniert das. Trotzdem interessiert es mich weiterhin, wie man beliebige Zeichenfolgen in Dateien finden kann. Ich werde noch ein bisschen ausprobiern.
Wen es interessiert, mein Script zu diesem Thema (drag & drop):
on open
copy (display dialog "sucheFH 0.1" & return & return & ¬
"Alle mit Freehand erzeugten EPS-Dateien werden in einen definierten Ordner kopiert." & return & ¬
"Nach dem Klick auf <Start> kann man diesen Ordner auswählen." buttons {"Abbruch", "Start"} default button "Start") to IntroResult
if the button returned of IntroResult is "Start" then
tell application "Finder"
activate
set liste to every file of selection
set OrdnerFreehanddateien to choose folder with prompt "In welchen Ordner sollen die Freehanddateien kopiert werden?"
end tell
set AnzahlFreehandDateien to 0
set AnzahlNichtFreehandDateien to 0
repeat with i from 1 to number of items in liste -- Es werden Elemente aus der Liste ausgelesen
set datei to item i of liste -- datei ist die aktuelle Datei innerhalb der repeat-Schleife
-- log the result
set dateierzeuger to (file creator of (get info for datei))
set dateityp to (file type of (get info for datei))
-- log the result
if (dateierzeuger = "FH70" or dateierzeuger = "FH80" or dateierzeuger = "FH90") and (dateityp = "EPSF") then
set AnzahlFreehandDateien to AnzahlFreehandDateien + 1
tell application "Finder"
move datei to OrdnerFreehanddateien
-- copy datei to OrdnerFreehanddateien
end tell
else
set AnzahlNichtFreehandDateien to AnzahlNichtFreehandDateien + 1
end if
end repeat
end if
activate me
display dialog "fertig!" & return & return & ¬
"Freehand-EPS: " & AnzahlFreehandDateien & return & ¬
"keine Freehand-EPS: " & AnzahlNichtFreehandDateien & return & ¬
"" buttons "OK" default button 1
if the button returned of IntroResult is "Abbruch" then
beep 2
end if
activate me
end open |
|
Nach oben |
|
 |
Raimo •-->


Anmeldedatum: 20.08.2003 Beiträge: 111
|
Verfasst am: 16.12.2003 - 15:32 Titel: |
|
|
andreas_koester hat Folgendes geschrieben: | Hallo Raimo, Hallo Snow,
@Raimo:
bei großen Dateien bleibt Dein Script hängen. Vielleicht habe ich auch irgendwas falsch gemacht. Verkraftet eine Liste auch mehrere MB?
|
mehrere MB? habs noch nie probiert, aber gut möglich, dass es irgenwann ein problem gibt.
am besten machst du mit Snow's lösung weiter er hat weit aus mehr nowHow als ich  _________________ http://home.tiscalinet.ch/wraimo/ |
|
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
|
|
|