2 Stimmen

Applescript: Bereinigung einer Zeichenkette

Ich habe eine Zeichenfolge mit unzulässigen Zeichen, die ich entfernen möchte, aber ich weiß nicht, welche Art von Zeichen vorhanden sein könnten.

Ich habe eine Liste von Zeichen erstellt, die nicht gefiltert werden sollen, und ich habe dieses Skript erstellt (auf der Grundlage eines anderen Skripts, das ich im Internet gefunden habe).

on clean_string(TheString)
    --Store the current TIDs. To be polite to other scripts.
    set previousDelimiter to AppleScript's text item delimiters
    set potentialName to TheString
    set legalName to {}
    set legalCharacters to {"a", "b", "c", "d", "e", "f", 
"g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
"s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E",
 "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
 "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5",
 "6", "7", "8", "9", "0", "?", "+", "-", "Ç", "ç", "á", "Á", "é",
 "É", "í", "Í", "ó", "Ó", "ú", "Ú", "â", "Â", "ã", "Ã", "ñ", "Ñ",
 "õ", "Õ", "à", "À", "è", "È", "ü", "Ü", "ö", "Ö", "!", "$", "%",
 "/", "(", ")", "&", "€", "#", "@", "=", "*", "+", "-", ",", ".",
 "–", "_", " ", ":", ";", ASCII character 10, ASCII character 13}

    --Whatever you want to eliminate.
    --Now iterate through the characters checking them.
    repeat with thisCharacter in the characters of potentialName
        set thisCharacter to thisCharacter as text
        if thisCharacter is in legalCharacters then
            set the end of legalName to thisCharacter
            log (legalName as string)

        end if
    end repeat
    --Make sure that you set the TIDs before making the
    --list of characters into a string.
    set AppleScript's text item delimiters to ""
    --Check the name's length.
    if length of legalName is greater than 32 then
        set legalName to items 1 thru 32 of legalName as text
    else
        set legalName to legalName as text
    end if
    --Restore the current TIDs. To be polite to other scripts.
    set AppleScript's text item delimiters to previousDelimiter
    return legalName
end clean_string

Das Problem ist, dass dieses Skript verdammt langsam ist und mir eine Zeitüberschreitung beschert.

Ich prüfe Zeichen für Zeichen und vergleiche sie mit der Liste legalCharacters. Wenn das Zeichen vorhanden ist, ist es in Ordnung. Wenn nicht, ignorieren.

Gibt es eine schnelle Möglichkeit, dies zu tun?

etwas wie

"jedes Zeichen von TheString untersuchen und diejenigen entfernen, die nicht in legalCharacters enthalten sind"

?

danke für jede Hilfe.

6voto

markratledge Punkte 16963

Auf welche Nicht-ASCI-Zeichen stoßen Sie? Wie ist Ihre Dateikodierung?

Es ist viel, viel effizienter, ein Shell-Skript und tr, sed oder perl zu verwenden, um Text zu verarbeiten. Alle Sprachen sind in OS X standardmäßig installiert.

Sie können ein Shell-Skript mit tr (wie im folgenden Beispiel) verwenden, um Zeilenumbrüche zu entfernen, und Sie können auch sed verwenden, um Leerzeichen zu entfernen (nicht im folgenden Beispiel):

set clean_text to do shell script "echo " & quoted form of the_string & "| tr -d '\\r\\n' "

Technischer Hinweis TN2065: Shell-Skript in AppleScript ausführen

Oder, mit Perl, wird dies nicht druckbare Zeichen entfernen:

set x to quoted form of "Sample text. smdm#$%%&"
set y to do shell script "echo " & x & " | perl -pe 's/[^[:alnum:]|[:space:]]//g'"

Suchen Sie in SO nach weiteren Beispielen für die Verwendung von tr, sed und perl zur Textverarbeitung mit Applescript. Oder suchen Sie MacScripter / AppleScript | Foren

3voto

stib Punkte 3011

Eine andere Shell-Skript-Methode könnte sein:

set clean_text to do shell script "echo " & quoted form of the_string & "|sed \"s/[^[:alnum:][:space:]]//g\""

das sed verwendet, um alles zu löschen, was kein alphanumerisches Zeichen oder ein Leerzeichen ist. Weitere Regex-Referenz aquí

2voto

Philip Regan Punkte 4886

Iteration in Applescript ist immer langsam, und es gibt wirklich keinen schnelleren Weg, diese Probleme zu umgehen. Die Protokollierung in Schleifen ist ein absolut garantierter Weg, um die Dinge zu verlangsamen. Setzen Sie den Befehl log mit Bedacht ein.

In Ihrem speziellen Fall haben Sie jedoch eine Längenbeschränkung, und die Verschiebung der Längenprüfung in die Wiederholungsschleife kann die Verarbeitungszeit erheblich verkürzen (knapp eine Sekunde für die Ausführung im Script Debugger, unabhängig von der Textlänge):

    on clean_string(TheString)
     set potentialName to TheString
     set legalName to {}
     set legalCharacters to {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "?", "+", "-", "Ç", "ç", "á", "Á", "é", "É", "í", "Í", "ó", "Ó", "ú", "Ú", "â", "Â", "ã", "Ã", "ñ", "Ñ", "õ", "Õ", "à", "À", "è", "È", "ü", "Ü", "ö", "Ö", "!", "$", "%", "/", "(", ")", "&", "€", "#", "@", "=", "*", "+", "-", ",", ".", "–", "_", " ", ":", ";", ASCII character 10, ASCII character 13}
 with timeout of 86400 seconds --86400 seconds = 24 hours

     repeat with thisCharacter in the characters of potentialName
      set thisCharacter to thisCharacter as text
      if thisCharacter is in legalCharacters then
       set the end of legalName to thisCharacter
       if length of legalName is greater than 32 then
        return legalName as text
       end if
      end if
     end repeat
 end timeout
     return legalName as text
    end clean_string

0voto

Dave Wolfe Punkte 11

BBEdit oder TextWrangler sind dabei viel, viel schneller. Laden Sie TextWrangler herunter (es ist kostenlos), öffnen Sie dann Ihre Datei und führen Sie Text -> Zap Gremlins... aus. Bringt das, was Sie brauchen? Wenn ja, feiern Sie das mit einem kalten Getränk. Wenn nicht, probieren Sie BBEdit aus (es ist nicht kostenlos) und erstellen Sie eine neue Text Factory mit so vielen "Replace All"-Bedingungen wie nötig, öffnen Sie dann Ihre Datei und führen Sie die Text Factory aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X