[GastForen Programmierung/Entwicklung AppleScript gelöst: Jahreszahlen umwandeln

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

gelöst: Jahreszahlen umwandeln

michael m.
Beiträge gesamt: 162

7. Sep 2010, 12:52
Beitrag # 1 von 14
Bewertung:
(6820 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich habe einen Code geschrieben, der das Jahr eines Datums von 2 Stellen auf 4 Stellen aufrüsten soll.

Dabei war folgender gedanke:
Das Datum wurde zerlegt in pruef Teile.
Pruefteile dd.mm.yy => item1.item2.item3
item 1 ist für Tag
item 2 ist für Monat
item 3 ist für Jahr

Dabei habe ich zwei Schleifen verwendet.
yyyy = 70 für 1970
Die Zahl wird in jZahl1 hochgezählt bis 70
Prüft item 3 ist gleich 70 dann
speichere in item 3 die Zahl 70 mit 19 davor

weitere Schleife
Die Zahl wird in jZahl hochgezählt von 1-9
wenn irgendeine zahl von 1 bis 9 da ist dann schreibe
in item 3 die gefundene Zahl mit 200 davor

Wenn die gefundene Zahl 10 ist dann
speichere 2010 in item 3

Code
if length of yyyy < 4 then 
-- Jahreszahlen in 4 Stellen umwandeln 90er
repeat with jZahl1 from 40 to yyyy -- Beginn: Schleife Jahreszahlen durchlaufen von 1940 bis 1999
if item 3 of pruefTeile = jZahl1 then -- Wenn die Jahreszahl 50 bis 99 ist dann
end if
set item 3 of pruefTeile to "19" & jZahl1 -- speicher die Jahreszahl in item 3
end repeat -- Ende: Schleife Jahreszahlen durchlaufen von 1950 bis 1999

-- Jahreszahlen in 4 Stellen umwandeln 2000er
repeat with jZahl2 from 1 to 9 -- Beginn: Schleife Jahreszahlen durchlaufen von 2001 bis 2010
if item 3 of pruefTeile = "0" & jZahl2 then -- Wenn die Jahreszahl 01 bis 09 ist dann
set item 3 of pruefTeile to "200" & jZahl2 -- speichere die Jahreszahl in item 3
end if
if item 3 of pruefTeile = "10" then -- oder wenn die Jahreszahl 10 ist dann
set item 3 of pruefTeile to "2010" -- speichere die Jahreszahl 2010 in item 3
end if
end repeat -- Ende: Schleife Jahreszahlen durchlaufen von 2001 bis 2010
end if -- display dialog item 3 of pruefTeile -- Korrektur Item Wert 3 (Jahreszahl z.B. "2008")
set gefundendatum to text items of pruefTeile as text -- fügt die text items wiede rzusammen zu einem Punkt getrennten Text
display dialog gefundendatum


Der Code funktioniert schon nur bin ich mir nicht sicher ob man das nicht zu umständlich ist?
Ich habe mir schon überlegt, ob es einen Befehl dafür gibt, aber dann kam der Gedanke wann soll 19 hundert und wann 20 hundert geschrieben werden. Deshalb habe ich mir diese Routine ausgedacht.

Ich bin für jede Kritik dankbar.

(Dieser Beitrag wurde von michael m. am 8. Sep 2010, 13:11 geändert)
X

Jahreszahlen umwandeln

Hans Haesler
  
Beiträge gesamt: 5826

7. Sep 2010, 13:07
Beitrag # 2 von 14
Beitrag ID: #450755
Bewertung:
(6815 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

ohne schon etwas ausprobiert zu haben: Das kann sicher viel einfacher gelöst werden.

Aber: Würdest Du bitte das komplette Script posten? Was ist in pruefTeile enthalten? Wie wird yyyy definiert?

Gruss, Hans


als Antwort auf: [#450750]

Jahreszahlen umwandeln

michael m.
Beiträge gesamt: 162

7. Sep 2010, 13:39
Beitrag # 3 von 14
Beitrag ID: #450761
Bewertung:
(6797 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

ich habe die Vervollständigung der Jahreszahl in die Prüfung auf ein echtes Datum eingebaut.

Hier der prüfungs Handler:
Code
set punktListe to {"16.10.68", "192.168.178.0", "21.03.1899", "99.65.00", "20.04.1705"} 
set anzahlPunktListe to 3

-- Schaut in die Liste mit Punkt getrennten Elementen und sucht nach echten Datumsangaben
-- und schreibt diese in eine Datumsliste
-- Dabei werden die Jahreszahlen auf 4 Stellen ergänzt

repeat with datumSchleife from 1 to anzahlPunktListe -- Beginn Schleife für Datum Prüfung
set pruefdatum to text item datumSchleife of punktListe -- schreibt das erste punktWort in die Variable pruefDatum
set pruefTeile to text items of pruefdatum -- schreibt pruefdatum Teile in eine Liste pruefTeile

if (count of pruefTeile) = 3 then -- Zählen der pruefTeile und wenn es drei sind dann
set dd to item 1 of pruefTeile -- zerlege ersten Zahlenblock in dd für Tag
set mm to item 2 of pruefTeile -- zerlege zweiten Zahlenblock in mm für Monat
set yyyy to item 3 of pruefTeile -- zerlege dritten Zahlenblock in yy für Jahr

-- Wenn Tag eine Ganzzahl und kleiner als 32 ist und
-- Monat eine ganzzahlt ist und kleiner als 13 und
-- die Länge von Jahr grösser ist als 1 und die länge kleiner al 5 ist dann
if (dd as integer < 32 and mm as integer < 13 and length of yyyy > 1 and length of yyyy < 5) then

-- Jahreszahlen auf 4 Stellen ergänzen
if length of yyyy < 4 then -- Wenn die Jahreszahl kleiner als 4 Stellen hat dann

-- Jahreszahlen in 4 Stellen umwandeln 90er
repeat with jZahl1 from 40 to yyyy -- Beginn: Schleife Jahreszahlen durchlaufen von 1950 bis 1999
if item 3 of pruefTeile = jZahl1 then -- Wenn die Jahreszahl 50 bis 99 ist dann
end if
set item 3 of pruefTeile to "19" & jZahl1 -- speicher die Jahreszahl in item 3
end repeat -- Ende: Schleife Jahreszahlen durchlaufen von 1950 bis 1999

-- Jahreszahlen in 4 Stellen umwandeln 2000er
repeat with jZahl2 from 1 to 9 -- Beginn: Schleife Jahreszahlen durchlaufen von 2001 bis 2010
if item 3 of pruefTeile = "0" & jZahl2 then -- Wenn die Jahreszahl 01 bis 09 ist dann
set item 3 of pruefTeile to "200" & jZahl2 -- speichere die Jahreszahl in item 3
end if
if item 3 of pruefTeile = "10" then -- oder wenn die Jahreszahl 10 ist dann
set item 3 of pruefTeile to "2010" -- speichere die Jahreszahl 2010 in item 3
end if
end repeat -- Ende: Schleife Jahreszahlen durchlaufen von 2001 bis 2010
end if
set gefundendatum to text items of pruefTeile as text -- fügt die text items wiede rzusammen zu einem Punkt getrennten Text
set end of datumListe to gefundendatum -- fügt den Inhalt von gefundendatum an das ende der endDatumListe hinzu
end if
end if
end repeat


Viele grüsse
Michael


als Antwort auf: [#450755]

Jahreszahlen umwandeln

Hans Haesler
  
Beiträge gesamt: 5826

7. Sep 2010, 14:35
Beitrag # 4 von 14
Beitrag ID: #450772
Bewertung:
(6778 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

funktioniert das bei Dir? Hier tut sich nichts.

Weil:
1. Die Variable datumListe ist nicht initialisiert;
2. Die text item delimiters sind normalerweise ein leerer String.

Wenn beides eingefügt ist, dann klappt es. Allerdings hast Du mit der Beschränkung auf drei Elemente nicht die ganze Testliste freigegeben.
Und es ist nur ein Datum, bei welchem die Jahrzahl ergänzt werden muss.

Es ist okay, zu prüfen, ob die Anzahl Tage und Monate innerhalb des Möglichen liegen. Aber dann sollte auch verhindert werden, dass ein Tag (oder ein Monat) "00" durchgelassen wird.

Schliesslich: Beim Anhängen von "19" bzw. "20" ist keine Schleife notwendig. Es genügt, zu testen, ob der Wert kleiner oder gleich wie 99 und grösser als 19 ist.
Das ergibt eine Spanne von 1920 bis 1999. Alles andere bekommt eine "20" angefügt.

Code
set punktListe to {"16.10.68", "192.168.178.0", "21.03.99", "99.65.00", "20.04.05", "23.08.69"} 
set anzahlPunktListe to count punktListe

-- Schaut in die Liste mit Punkt getrennten Elementen und sucht nach echten Datumsangaben
-- und schreibt diese in eine Datumsliste
-- Dabei werden die Jahreszahlen auf 4 Stellen ergänzt

set datumListe to {}
set AppleScript's text item delimiters to "."

repeat with datumSchleife from 1 to anzahlPunktListe -- Beginn Schleife für Datum Prüfung
set pruefdatum to text item datumSchleife of punktListe -- schreibt das erste punktWort in die Variable pruefDatum
set pruefTeile to text items of pruefdatum -- schreibt pruefdatum Teile in eine Liste pruefTeile

if (count of pruefTeile) = 3 then -- Zählen der pruefTeile und wenn es drei sind dann
set dd to (item 1 of pruefTeile) as integer -- zerlege ersten Zahlenblock in dd für Tag
set mm to (item 2 of pruefTeile) as integer -- zerlege zweiten Zahlenblock in mm für Monat
set yyyy to item 3 of pruefTeile -- zerlege dritten Zahlenblock in yy für Jahr
set yy to yyyy as integer

-- Wenn Tag eine Ganzzahl und kleiner als 32 (aber grösser als 0) ist und
-- Monat eine Ganzzahl ist und kleiner als 13 (aber grösser als 0) ist und
-- die Länge von Jahr grösser ist als 1 und kleiner als 5 ist dann
if (dd is less than 32 and dd is greater than or equal to 1) then
if (mm is less than 13 and mm is greater than or equal to 1) then
if (length of yyyy is greater than 1 and length of yyyy is less than 5) then

-- Jahreszahlen auf 4 Stellen ergänzen
if length of yyyy is 2 then -- Wenn die Jahreszahl zwei Stellen hat

-- Jahreszahlen in 4 Stellen umwandeln
if yy is less than or equal to 99 and yy is greater than 19 then
set item 3 of pruefTeile to "19" & yyyy -- speichere die Jahreszahl in item 3
else
set item 3 of pruefTeile to "20" & yyyy -- speichere die Jahreszahl in item 3
end if
end if

set gefundendatum to text items of pruefTeile as text -- fügt die text items wieder zusammen zu einem punktgetrennten Text
set end of datumListe to gefundendatum -- fügt den Inhalt von gefundendatum an das ende der endDatumListe hinzu
end if
end if
end if
end if
end repeat

set AppleScript's text item delimiters to {""}
datumListe

Gruss, Hans


als Antwort auf: [#450761]

Jahreszahlen umwandeln

michael m.
Beiträge gesamt: 162

7. Sep 2010, 17:09
Beitrag # 5 von 14
Beitrag ID: #450785
Bewertung:
(6745 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

das ist mein kompletter Handler.
Die Jahreszahlenumwandung von Dir mache ich morgen rein.

Soweit funktioniert er ganz gut nur wenn ich den Textblock ohne Datum drin aktiviere dann kommt immer die meldung das endDatum nicht definiert ist.

Ich habe extra endDatum auf "kein Datum enthalten gesetzt" damit auf jeden fall etwas in der Variable drin ist.

Ich habe schon lange nach den fehler gesucht aber ohne Erfolg. Es wäre nett wenn Du mal schauen könntest.

Vielen Dank
Michael


Code
-- Mit Datum im Text 
-- set textBlock to "16.10.68 in Dormagen Zons, die Rufnummer damals 02133 449899, der IP Adressraum ist 192.107.155 es gibt weitere Daten 21.03.1899 und 15.05.2009"

-- Ohne Datum im Text
set textBlock to "in Dormagen Zons, die Rufnummer damals 02133 449899, der IP Adressraum ist 192.107.155 es gibt weitere Daten"



set {endDatum, jahresDatum, rueckDatum} to findeDatum(textBlock)


on findeDatum(textBlock)
-- Handler für das auffinden von Datumsangaben aus dem Textblock der Variable "textBlock"

-- Textblock in eine Liste umwandeln --
set textListe to every word of textBlock
-- Anzahl der Worte aus der Liste ermitteln
set anzahlListe to count textListe

-- Punkt Elemente aus der textListe ermitteln --
set punktListe to {} -- Variablen definition punktListe
repeat with punktSchleife from 1 to anzahlListe -- Beginn: Schleife Punktelemente ermitteln
-- speichert alle Wörter nach und nach in die Variable punktElement
set punktElement to item punktSchleife of textListe
-- Prüft ob punktElement Punkte enthät und
-- ob punktElement grösser oder gleich lang ist als 6 Zeichen und
-- ob punktElement kleiner als 11 Zeichen besitzt, dann
if punktElement contains "." and length of punktElement is greater than or equal to 6 and length of punktElement < 11 then
set punktPuffer to punktElement -- speichert das gefundene punktElement in punktPuffer
set end of punktListe to punktPuffer -- Fügt punktPuffer an die Liste datumListe
end if
end repeat -- Ende: Schleife Punktelemente ermitteln

-- punktListe auf Datumsechheit prüfen
-- Anzahl der Worte aus der datumListe1 ermitteln
set anzahlPunktListe to count punktListe
-- Zerlegung der Textitems durch den Punkt "."
set text item delimiters to "."
set datumListe to {} -- Variablen definition datumListe

repeat with datumSchleife from 1 to anzahlPunktListe -- Beginn Schleife für Datum Prüfung
set endDatum to "kein Datum enthalten" as text
set jahresDatum to "kein Datum enthalten" as text
set rueckDatum to "kein Datum enthalten" as text

set pruefdatum to text item datumSchleife of punktListe -- schreibt das erste punktWort in die Variable pruefDatum
set pruefTeile to text items of pruefdatum -- schreibt pruefdatum Teile in eine Liste pruefTeile
-- display dialog datumTeile
if (count of pruefTeile) = 3 then -- Zählen der pruefTeile und wenn es drei sind dann
set dd to item 1 of pruefTeile -- zerlege ersten Zahlenblock in dd für Tag
set mm to item 2 of pruefTeile -- zerlege zweiten Zahlenblock in mm für Monat
set yyyy to item 3 of pruefTeile -- zerlege dritten Zahlenblock in yy für Jahr

if (dd as integer < 32 and mm as integer < 13 and length of yyyy > 1 and length of yyyy < 5) then
-- Wenn Tag eine Ganzzahl und kleiner als 32 ist und
-- Monat eine ganzzahlt ist und kleiner als 13 und
-- die Länge von Jahr grösser ist als 1 und die länge kleiner al 5 ist dann

if length of yyyy < 4 then
-- Jahreszahlen in 4 Stellen umwandeln 90er
repeat with jZahl1 from 40 to yyyy -- Beginn: Schleife Jahreszahlen durchlaufen von 1950 bis 1999
if item 3 of pruefTeile = jZahl1 then -- Wenn die Jahreszahl 50 bis 99 ist dann
end if
set item 3 of pruefTeile to "19" & jZahl1 -- speicher die Jahreszahl in item 3
end repeat -- Ende: Schleife Jahreszahlen durchlaufen von 1950 bis 1999

-- Jahreszahlen in 4 Stellen umwandeln 2000er
repeat with jZahl2 from 1 to 9 -- Beginn: Schleife Jahreszahlen durchlaufen von 2001 bis 2010
if item 3 of pruefTeile = "0" & jZahl2 then -- Wenn die Jahreszahl 01 bis 09 ist dann
set item 3 of pruefTeile to "200" & jZahl2 -- speichere die Jahreszahl in item 3
end if
if item 3 of pruefTeile = "10" then -- oder wenn die Jahreszahl 10 ist dann
set item 3 of pruefTeile to "2010" -- speichere die Jahreszahl 2010 in item 3
end if
end repeat -- Ende: Schleife Jahreszahlen durchlaufen von 2001 bis 2010
end if -- display dialog item 3 of pruefTeile -- Korrektur Item Wert 3 (Jahreszahl z.B. "2008")

set gefundendatum to text items of pruefTeile as text -- fügt die text items wiede rzusammen zu einem Punkt getrennten Text
set end of datumListe to gefundendatum -- fügt den Inhalt von datumListe2 an das ende der endDatumListe hinzu
end if

-- Sucht das aktuellste Datum in der Datum Liste heraus
set aktuellesDatum to date (item 1 of datumListe)
set datumMerker to 1
repeat with datumSchleife from 2 to count of datumListe
set tempDate to date (item datumSchleife of datumListe)
if tempDate comes after aktuellesDatum then
set aktuellesDatum to tempDate
set datumMerker to datumSchleife
end if
end repeat
set endDatum to item datumMerker of datumListe
end if

end repeat -- Ende Schleife für Datum Prüfung

-- Extrahiere Datumteile aus dem gefundenen endDatum
set text item delimiters to "."
set pT to text items of endDatum -- schreibt pruefdatum Teile in eine Liste pruefTeile

set pTag to item 1 of pT -- zerlege ersten Zahlenblock in dd für Tag
set pMonat to item 2 of pT -- zerlege zweiten Zahlenblock in mm für Monat
set pJahr to item 3 of pT -- zerlege dritten Zahlenblock in yy für Jahr

-- Rückwärtsdatum für den Dateinamen
set text item delimiters to "-" -- Zerlegung der Textitems durch den Bindestrich "-"
set jahresDatum to pJahr
set rueckDatum to {pJahr, pMonat, pTag} as text -- speichert die item TextBlöcke in angegebener Reihenfolge wieder als einen Text


-- Übergebe die Variablen zurück an das Script
return {endDatum, jahresDatum, rueckDatum}
end findeDatum



als Antwort auf: [#450772]

Jahreszahlen umwandeln

Hans Haesler
  
Beiträge gesamt: 5826

7. Sep 2010, 20:45
Beitrag # 6 von 14
Beitrag ID: #450795
Bewertung:
(6713 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

also ... beim Festlegen der text item delimiters gibt es zwei Dinge zu beachten:

1. Die Definition immer so:

Code
set AppleScript's text item delimiters to {"."} 

Ob als Liste oder nicht ist nicht so wichtig (es gibt zwar welche, die sagen, dass es als Liste langsamer funktioniert).
Aber immer mit AppleScript's (auch wenn ein gescheites Buch Dir sagt, dass es ohne auch geht).

2. Am Schluss des Scripts immer auf einen leeren String zurücksetzen. Hier als Liste definiert, weil das die Vorgabe ist.

Code
set AppleScript's text item delimiters to {""} 

Aber das alles hilft Dir nicht weiter, wenn im Textblock kein Datum enthalten ist.

In diesem Fall bleibt die Variable punktListe leer. Deshalb muss die grosse Repeat-Schleife mit einem if-Wickel umgeben werden, damit sie nur ausgeführt wird, wenn die Liste mindestens ein Element enthält.

Die drei Variablen müssen zwei Mal auf "kein Datum enthalten" gesetzt werden. Einmal ausserhalb der Schleife. Und einmal innerhalb. Für den Fall, dass sich in der Liste mehrere Datums-Kandidaten befinden. Dann werden die drei Variablen bei jedem Umgang initialisiert.

Code
-- Mit Datum im Text 
--set textBlock to "16.10.68 in Dormagen Zons, die Rufnummer damals 02133 449899, der IP Adressraum ist 192.107.155 es gibt weitere Daten 21.03.1899 und 15.05.2009"

-- Ohne Datum im Text
set textBlock to "in Dormagen Zons, die Rufnummer damals 02133 449899, der IP Adressraum ist 192.107.155 es gibt weitere Daten"

-- Aufruf des Handlers
set {endDatum, jahresDatum, rueckDatum} to findeDatum(textBlock)

-- die Textitem-Delimiters auf einen leeren String zurücksetzen
set AppleScript's text item delimiters to {""}

-- Wiederholung der Liste, damit die Werte im Ergebnisfenster erscheinen
{endDatum, jahresDatum, rueckDatum}

-- Handler für das Auffinden von Datumsangaben aus dem Textblock der Variable "textBlock"
on findeDatum(textBlock)

-- Textblock in eine Liste umwandeln
set textListe to every word of textBlock
-- Anzahl der Worte aus der Liste ermitteln
set anzahlListe to count textListe

-- Punkt-Elemente aus der textListe ermitteln
set punktListe to {} -- Variablen-Definition punktListe
repeat with punktSchleife from 1 to anzahlListe -- Beginn: Schleife Punkt-Elemente ermitteln
-- speichert alle Wörter nach und nach in die Variable punktElement
set punktElement to item punktSchleife of textListe
-- Prüft ob punktElement Punkte enthät und
-- ob punktElement grösser oder gleich lang ist als 6 Zeichen und
-- ob punktElement kleiner als 11 Zeichen ist, dann
if punktElement contains "." and length of punktElement is greater than or equal to 6 and length of punktElement < 11 then
set punktPuffer to punktElement -- speichert das gefundene punktElement in punktPuffer
set end of punktListe to punktPuffer -- Fügt punktPuffer an die Liste datumListe
end if
end repeat -- Ende: Schleife Punktelemente ermitteln

-- punktListe auf Datums-Echtheit prüfen
-- Anzahl der Worte aus der datumListe1 ermitteln
set anzahlPunktListe to count punktListe

-- Zerlegung der Textitems durch den Punkt "."
set AppleScript's text item delimiters to "."
-- Variablen-Definition datumListe
set datumListe to {}

-- die drei Variablen definieren
set endDatum to "kein Datum enthalten"
set jahresDatum to "kein Datum enthalten"
set rueckDatum to "kein Datum enthalten"

if anzahlPunktListe is greater than 0 then
repeat with datumSchleife from 1 to anzahlPunktListe -- Beginn Schleife für Datums-Prüfung
set endDatum to "kein Datum enthalten"
set jahresDatum to "kein Datum enthalten"
set rueckDatum to "kein Datum enthalten"

set pruefdatum to text item datumSchleife of punktListe -- schreibt das erste punktWort in die Variable pruefDatum
set pruefTeile to text items of pruefdatum -- schreibt pruefdatum Teile in eine Liste pruefTeile
-- display dialog datumTeile
if (count of pruefTeile) = 3 then -- Zählen der pruefTeile und wenn es drei sind dann
set dd to item 1 of pruefTeile -- zerlege ersten Zahlenblock in dd für Tag
set mm to item 2 of pruefTeile -- zerlege zweiten Zahlenblock in mm für Monat
set yyyy to item 3 of pruefTeile -- zerlege dritten Zahlenblock in yy für Jahr

-- Wenn Tag eine Ganzzahl und kleiner als 32 ist und
-- Monat eine Ganzzahl ist und kleiner als 13 und
-- die Länge von Jahr grösser ist als 1 und die Länge kleiner als 5 ist dann
if (dd as integer < 32 and mm as integer < 13 and length of yyyy > 1 and length of yyyy < 5) then

if length of yyyy < 4 then
-- Jahreszahlen in 4 Stellen umwandeln 90er
repeat with jZahl1 from 40 to yyyy -- Beginn: Schleife Jahreszahlen durchlaufen von 1950 bis 1999
if item 3 of pruefTeile = jZahl1 then -- Wenn die Jahreszahl 50 bis 99 ist dann
end if
set item 3 of pruefTeile to "19" & jZahl1 -- speicher die Jahreszahl in item 3
end repeat -- Ende: Schleife Jahreszahlen durchlaufen von 1950 bis 1999

-- Jahreszahlen in 4 Stellen umwandeln 2000er
repeat with jZahl2 from 1 to 9 -- Beginn: Schleife Jahreszahlen durchlaufen von 2001 bis 2010
if item 3 of pruefTeile = "0" & jZahl2 then -- Wenn die Jahreszahl 01 bis 09 ist dann
set item 3 of pruefTeile to "200" & jZahl2 -- speichere die Jahreszahl in item 3
end if
if item 3 of pruefTeile = "10" then -- oder wenn die Jahreszahl 10 ist dann
set item 3 of pruefTeile to "2010" -- speichere die Jahreszahl 2010 in item 3
end if
end repeat -- Ende: Schleife Jahreszahlen durchlaufen von 2001 bis 2010
end if -- display dialog item 3 of pruefTeile -- Korrektur Item Wert 3 (Jahreszahl z.B. "2008")

set gefundendatum to text items of pruefTeile as text -- fügt die text items wieder zusammen zu einem punktgetrennten Text
set end of datumListe to gefundendatum -- fügt den Inhalt von datumListe2 an das Ende der endDatumListe hinzu
end if

-- Sucht das aktuellste Datum in der DatumS-Liste heraus
set aktuellesDatum to date (item 1 of datumListe)
set datumMerker to 1
repeat with datumSchleife from 2 to count of datumListe
set tempDate to date (item datumSchleife of datumListe)
if tempDate comes after aktuellesDatum then
set aktuellesDatum to tempDate
set datumMerker to datumSchleife
end if
end repeat
set endDatum to item datumMerker of datumListe
end if
end repeat -- Ende Schleife für Datums-Prüfung

-- Extrahiere Datumteile aus dem gefundenen endDatum
set pT to text items of endDatum -- schreibt pruefdatum Teile in die Liste pruefTeile

set pTag to item 1 of pT -- zerlege ersten Zahlenblock in dd für Tag
set pMonat to item 2 of pT -- zerlege zweiten Zahlenblock in mm für Monat
set pJahr to item 3 of pT -- zerlege dritten Zahlenblock in yy für Jahr

-- Rückwärtsdatum für den Dateinamen
set AppleScript's text item delimiters to "-" -- Zerlegung der Textitems durch den Bindestrich "-"
set jahresDatum to pJahr
set rueckDatum to {pJahr, pMonat, pTag} as text -- speichert die item TextBlöcke in angegebener Reihenfolge wieder als einen Text
end if

-- Übergebe die Variablen zurück zum Handler-Aufruf
return {endDatum, jahresDatum, rueckDatum}
end findeDatum

Das Einfügen der Vereinfachung, welche weiter oben gepostet ist, überlasse ich Dir.

Gruss, Hans


als Antwort auf: [#450785]

Jahreszahlen umwandeln

michael m.
Beiträge gesamt: 162

8. Sep 2010, 06:04
Beitrag # 7 von 14
Beitrag ID: #450811
Bewertung:
(6686 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

Nochmals vielen Dank.

Das Script läuft jetzt nur 2 mal und danach gibt es ein Problem mit dem item 2.

„item 2 of {"kein Datum enthalten"}“ kann nicht gelesen werden..

Der Gedankenanstoss mit dem überprüfen der Anzahl der DatumListe ist gut um zu wissen wie man denken muss um eine äussere Schleife zu machen


Viele Grüsse

Michael


als Antwort auf: [#450795]
(Dieser Beitrag wurde von michael m. am 8. Sep 2010, 07:11 geändert)

Jahreszahlen umwandeln

Hans Haesler
  
Beiträge gesamt: 5826

8. Sep 2010, 07:44
Beitrag # 8 von 14
Beitrag ID: #450812
Bewertung:
(6671 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

bitteschön.

Diese Fehlermeldung deutet darauf hin, dass beim Ergänzen des Scripts etwas nicht richtig eingesetzt worden ist.

Wie sieht Dein Code denn jetzt aus?

Gruss, Hans


als Antwort auf: [#450811]

Jahreszahlen umwandeln

michael m.
Beiträge gesamt: 162

8. Sep 2010, 08:05
Beitrag # 9 von 14
Beitrag ID: #450813
Bewertung:
(6664 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

so sieht er zur Zeit aus.
Code
on findeDatum(textBlock) 

-- Textblock in eine Liste umwandeln
set textListe to every word of textBlock
-- Anzahl der Worte aus der Liste ermitteln
set anzahlListe to count textListe

-- Punkt-Elemente aus der textListe ermitteln
set punktListe to {} -- Variablen-Definition punktListe
repeat with punktSchleife from 1 to anzahlListe -- Beginn: Schleife Punkt-Elemente ermitteln
-- speichert alle Wörter nach und nach in die Variable punktElement
set punktElement to item punktSchleife of textListe
-- Prüft ob punktElement Punkte enthät und
-- ob punktElement grösser oder gleich lang ist als 6 Zeichen und
-- ob punktElement kleiner als 11 Zeichen ist, dann
if punktElement contains "." and length of punktElement is greater than or equal to 6 and length of punktElement < 11 then
set punktPuffer to punktElement -- speichert das gefundene punktElement in punktPuffer
set end of punktListe to punktPuffer -- Fügt punktPuffer an die Liste datumListe
end if
end repeat -- Ende: Schleife Punktelemente ermitteln

-- punktListe auf Datums-Echtheit prüfen
-- Anzahl der Worte aus der datumListe1 ermitteln
set anzahlPunktListe to count punktListe

-- Zerlegung der Textitems durch den Punkt "."
set AppleScript's text item delimiters to "."
-- Variablen-Definition datumListe
set datumListe to {}

-- die drei Variablen definieren
set endDatum to "kein Datum enthalten"
set jahresDatum to "kein Datum enthalten"
set rueckDatum to "kein Datum enthalten"

if anzahlPunktListe is greater than 0 then
repeat with datumSchleife from 1 to anzahlPunktListe -- Beginn Schleife für Datums-Prüfung
set endDatum to "kein Datum enthalten"
set jahresDatum to "kein Datum enthalten"
set rueckDatum to "kein Datum enthalten"

set pruefdatum to text item datumSchleife of punktListe -- schreibt das erste punktWort in die Variable pruefDatum
set pruefTeile to text items of pruefdatum -- schreibt pruefdatum Teile in eine Liste pruefTeile
-- display dialog datumTeile
if (count of pruefTeile) = 3 then -- Zählen der pruefTeile und wenn es drei sind dann
set dd to item 1 of pruefTeile -- zerlege ersten Zahlenblock in dd für Tag
set mm to item 2 of pruefTeile -- zerlege zweiten Zahlenblock in mm für Monat
set yyyy to item 3 of pruefTeile -- zerlege dritten Zahlenblock in yy für Jahr

-- Wenn Tag eine Ganzzahl und kleiner als 32 ist und
-- Monat eine Ganzzahl ist und kleiner als 13 und
-- die Länge von Jahr grösser ist als 1 und die Länge kleiner als 5 ist dann
if (dd as integer < 32 and mm as integer < 13 and length of yyyy > 1 and length of yyyy < 5) then

if length of yyyy < 4 then
-- Jahreszahlen in 4 Stellen umwandeln 90er
repeat with jZahl1 from 40 to yyyy -- Beginn: Schleife Jahreszahlen durchlaufen von 1950 bis 1999
if item 3 of pruefTeile = jZahl1 then -- Wenn die Jahreszahl 50 bis 99 ist dann
end if
set item 3 of pruefTeile to "19" & jZahl1 -- speicher die Jahreszahl in item 3
end repeat -- Ende: Schleife Jahreszahlen durchlaufen von 1950 bis 1999

-- Jahreszahlen in 4 Stellen umwandeln 2000er
repeat with jZahl2 from 1 to 9 -- Beginn: Schleife Jahreszahlen durchlaufen von 2001 bis 2010
if item 3 of pruefTeile = "0" & jZahl2 then -- Wenn die Jahreszahl 01 bis 09 ist dann
set item 3 of pruefTeile to "200" & jZahl2 -- speichere die Jahreszahl in item 3
end if
if item 3 of pruefTeile = "10" then -- oder wenn die Jahreszahl 10 ist dann
set item 3 of pruefTeile to "2010" -- speichere die Jahreszahl 2010 in item 3
end if
end repeat -- Ende: Schleife Jahreszahlen durchlaufen von 2001 bis 2010
end if -- display dialog item 3 of pruefTeile -- Korrektur Item Wert 3 (Jahreszahl z.B. "2008")

set gefundendatum to text items of pruefTeile as text -- fügt die text items wieder zusammen zu einem punktgetrennten Text
set end of datumListe to gefundendatum -- fügt den Inhalt von datumListe2 an das Ende der endDatumListe hinzu
end if

-- Sucht das aktuellste Datum in der DatumS-Liste heraus
set aktuellesDatum to date (item 1 of datumListe)
set datumMerker to 1
repeat with datumSchleife from 2 to count of datumListe
set tempDate to date (item datumSchleife of datumListe)
if tempDate comes after aktuellesDatum then
set aktuellesDatum to tempDate
set datumMerker to datumSchleife
end if
end repeat
set endDatum to item datumMerker of datumListe
end if
end repeat -- Ende Schleife für Datums-Prüfung

-- Extrahiere Datumteile aus dem gefundenen endDatum
set pT to text items of endDatum -- schreibt pruefdatum Teile in die Liste pruefTeile

set pTag to item 1 of pT -- zerlege ersten Zahlenblock in dd für Tag
set pMonat to item 2 of pT -- zerlege zweiten Zahlenblock in mm für Monat
set pJahr to item 3 of pT -- zerlege dritten Zahlenblock in yy für Jahr

-- Rückwärtsdatum für den Dateinamen
set AppleScript's text item delimiters to "-" -- Zerlegung der Textitems durch den Bindestrich "-"
set jahresDatum to pJahr
set rueckDatum to {pJahr, pMonat, pTag} as text -- speichert die item TextBlöcke in angegebener Reihenfolge wieder als einen Text
end if

-- Übergebe die Variablen zurück zum Handler-Aufruf
return {endDatum, jahresDatum, rueckDatum}
end findeDatum


Ich habe beim einpassen genau darauf geachtet wo die Schleifen beginnen und Enden.

Dazwischen habe ich den Code eingefügt.

Ich habe auch das end if mal an anderer Stele positioniert wie
end if -- hier
end repeat -- Ende Schleife für Datums-Prüfung

hat aber auch keine Wirkung gezeigt.

Viele Grüsse

Michael


als Antwort auf: [#450812]
(Dieser Beitrag wurde von michael m. am 8. Sep 2010, 08:10 geändert)

Jahreszahlen umwandeln

Hans Haesler
  
Beiträge gesamt: 5826

8. Sep 2010, 08:41
Beitrag # 10 von 14
Beitrag ID: #450815
Bewertung:
(6648 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

ich kann Dein zuletzt gepostetes Script (ergänzt mit textBlock-String und Handler-Aufruf) beliebig oft ausführen – es kommt keine Fehlermeldung.

Und die Jahreszahl wird immer noch mit Schleifen ermittelt. Statt mit dem viel einfacheren Test.

Gruss, Hans


als Antwort auf: [#450813]

Jahreszahlen umwandeln

michael m.
Beiträge gesamt: 162

8. Sep 2010, 14:51
Beitrag # 11 von 14
Beitrag ID: #450859
Bewertung:
(6611 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Forumgemeinde,

ich hatte Hans per email das komplette (Handler mit Hauptscript) Script gesendet, da es wohl unterschiedlich ausgeführt wird.

Bei Hans lief alles bestens auf einem G4 mit Tiger.
Bei mir auf einen iMac QuadCore mit Snow Leopard,
nicht richtig.

Ich habe darauf den kompletten Handler neu geschrieben und dabei auch die Schleifen, die Abfragen geändert und natürlich auch das Jahresdatum welches oben beschrieben wurde eingepflegt.

Danach funktionierte der Handler mit dem Hauptscript sehr gut.

Bei manchen Dokumenten gab es Fehler im Handler.
Da ich aber den Handler mit allen Möglichkeiten geprüft habe konnte es daran nicht liegen.

Auf einen Mac Mini mit Leopard lies ich das aktuelle Script mit dem Fragwürdigen Dokument laufen und wunderbar.

Es funktionier bei Tiger und Leopard bestens, bei Snow Leopard allerdings mit einigen Einschränkungen.

Da ich auf den Mini ausweichen kann ist mein Problem gelöst.

Viele Grüsse
Michael


als Antwort auf: [#450815]

Jahreszahlen umwandeln

Hans Haesler
  
Beiträge gesamt: 5826

8. Sep 2010, 22:31
Beitrag # 12 von 14
Beitrag ID: #450901
Bewertung:
(6594 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Michael,

ich habe jetzt kurz ein paar Tests unter Snow Leopard und Leopard gemacht.

Ergebnis: Deine Erfahrung kann ich bestätigen. Mit Deiner PDF-Datei kommt der Leopard klar. Aber unter SnowLeo gibt es eine Fehlermeldung.

Näher hingeschaut: Unter Leopard werden 2163 Worte gezählt. Mit SnowLeo nur 1454.

Diese Zahl habe so erfahren:

Code
display dialog "" & anzahlListe 
error number -128

Wobei die zweite Zeile die Ausführung des Scripts abbricht. Gleichbedeutend mit dem Klick des Anwenders auf den "Abbrechen"-Button.

Mit ähnlichen Befehlen noch die Anzahl Worte mit Punkten geholt. Und den Inhalt der punktListe.

Code
display dialog "" & (count of punktListe) 
-- display dialog "" & punktListe
error number -128

Mit Leopard ist die Liste leer. Mit SnowLeo sind vier Elemente drin. Diese: "tcw.rzl.ng.amSchutz.l.it.ungllk".

Kein Wunder, dass es beim Versuch, eines dieser Elemente in eine Ganzzahl zu verwandeln, eine Fehlermeldung absetzt.

Diese kann abgefangen werden, indem ein "try"-Wickel um die ganze Datums-Prüfung gelegt wird:

Code
repeat with datumSchleife from 1 to anzahlPunktListe -- Beginn: Datums-Prüfung  
try
-- und so weiter und so fort
end try
end repeat

"try" heisst "versuche". Und wenn es nicht geht, dann sage nichts. Und so kann unter Schneeleopard die Fehlermeldung unterdrückt werden.

Eigentlich hat "try" noch den "on error"-Abschnitt, in welchem bei einem aufgetretenen Fehler etwas gemacht werden kann: Eine Variable um Eins erhöhen ...

Code
try 
-- versuche mal dies
on error
set probCtr to probCtr + 1
end try

... oder einen Rapport ergänzen oder einen (verständlichen) Dialog zeigen usw.

Das alles ist aber hier nicht notwendig. Weil mit einer leerbleibenden Datumsliste sowieso die entsprechende Aktion ausgelöst wird.

Was mir allerdings an der ganzen Sache nicht so gefällt: Das Script arbeitet zuviel. Weil im Ergebnis von "every word" aus einer Masse von "Worten" die punktenthaltenden herausgepickt werden.

Es wäre effizienter, wenn man direkt nur jene Strings bekäme, welche aus Ziffern und Punkten zusammengesetzt sind.

Die Lösung dazu werde ich aber erst morgen posten.

Gruss, Hans


als Antwort auf: [#450859]

Jahreszahlen umwandeln

michael m.
Beiträge gesamt: 162

8. Sep 2010, 22:45
Beitrag # 13 von 14
Beitrag ID: #450904
Bewertung:
(6587 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für die Information.
Morgen werde ich den try Befehl implementieren.

Viele Grüsse
Michael


als Antwort auf: [#450901]

Jahreszahlen umwandeln

michael m.
Beiträge gesamt: 162

9. Sep 2010, 08:33
Beitrag # 14 von 14
Beitrag ID: #450911
Bewertung:
(6557 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

das mit dem try Block hat gut funktioniert.
Jetzt macht auch Snow Leopard mit den Problematischen PDF Dokumenten keinen Ärger mehr.

Vielen Dank

Gruss
Michaeö


als Antwort auf: [#450904]
X