[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:
(6830 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
  1. 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:
(6825 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:
(6807 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
  1. 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:
(6788 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
  1. 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:
(6755 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
  1. -- 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:
(6723 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
  1. 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
  1. 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
  1. -- 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:
(6696 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:
(6681 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:
(6674 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

so sieht er zur Zeit aus.
Code
  1. 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:
(6658 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:
(6621 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:
(6604 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
  1. 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
  1. 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
  1. 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
  1. 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:
(6597 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:
(6567 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