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

string in mehreren datein suchen

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


Anmeldedatum: 04.12.2003
Beiträge: 2

BeitragVerfasst am: 10.12.2003 - 22:06    Titel: string in mehreren datein suchen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Raimo
•-->
•-->


Anmeldedatum: 20.08.2003
Beiträge: 111

BeitragVerfasst am: 11.12.2003 - 08:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Snow
Administrator
Administrator


Anmeldedatum: 21.11.2000
Beiträge: 1946
Wohnort: Deiningen

BeitragVerfasst am: 11.12.2003 - 20:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name
andreas_koester
•->
•->


Anmeldedatum: 04.12.2003
Beiträge: 2

BeitragVerfasst am: 15.12.2003 - 22:33    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Raimo
•-->
•-->


Anmeldedatum: 20.08.2003
Beiträge: 111

BeitragVerfasst am: 16.12.2003 - 15:32    Titel: Antworten mit Zitat

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 Rolling Eyes Neutral
_________________
http://home.tiscalinet.ch/wraimo/
Nach oben
Benutzer-Profile anzeigen Private Nachricht 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