Wie kann ich AppleScript verwenden, um zu sehen, ob eine bestimmte Zeile einer TXT-Datei mit einer Variablen übereinstimmt?

Ich habe eine .txt-Datei auf meinem Computer gespeichert. Der Inhalt der .txt-Datei sieht beispielsweise so aus:

Ich möchte, dass meine Automator-Anwendung die erste Zeile der TXT-Datei liest und diese Zeile in eine neue Variable einfügt. Damit kann ich überprüfen, ob diese Variable mit einer anderen Variable übereinstimmt.

Mein ultimatives Ziel ist es, dass meine Anwendung das heutige Datum automatisch an den Anfang der Datei schreibt und eine zusätzliche Leerzeile unter dem heutigen Datum hinzufügt. Aber ich will natürlich nur, dass das passiert, wenn das heutige Datum nicht schon aktenkundig ist.

Hier ist der Code, den ich bisher habe:

# Part 1
# Get and format today's date.

set TodayDate to current date
set y to text -4 thru -1 of ("0000" & (year of TodayDate))
set m to text -2 thru -1 of ("00" & ((month of TodayDate) as integer))
set d to text -2 thru -1 of ("00" & (day of TodayDate))
set FormattedTodayDate to y & "_" & m & "_" & d & " -"


# Part 2
# Get the first line of the .txt file.

set Target_Filepath to quoted form of "/Users/Me/Desktop/Documents/My Fruit Log.txt"

set FirstLineOfTxtFile to <this is where I need your help, Ask Different>


# Part 3
# Check to see if the first line of the .txt file is today's date.

set TodayDateAlreadyWritten to false

if FirstLineOfTxtFile contains FormattedTodayDate then
    set TodayDateAlreadyWritten to true
end if


# Part 4
# Write today's date to the first line of the .txt file (if necessary).

if TodayDateAlreadyWritten = false then

    set TextToWrite to FormattedTodayDate & "
    "       
    set OriginalText to quoted form of (do shell script "cat " & Target_Filepath)
    set TextToWrite to quoted form of TextToWrite & "\n" & OriginalText
    do shell script "echo " & TextToWrite & " > " & Target_Filepath

end if

Es ist Teil 2 , wo ich Hilfe benötige.

Ich habe möglicherweise einige Fehler in einem der Teile des obigen Codes gemacht (aber meines Wissens keine), also fühlen Sie sich bitte frei, mich zu korrigieren, wenn Sie es für richtig halten.

Das sind meine Quellen:

Teil 1: Kurze Datumsangaben in AppleScript formatieren

Teil 4: Wie kann man Textdateien in AppleScript voranstellen?

Ich habe die Antwort aktualisiert, um das Problem mit der Wagenrückgabe zu beheben .

Antworten (2)

0DOkay, ich glaube, ich habe den Fehler in Bezug auf die Verwendung catim do shell script Befehl eingegrenzt und den Code so geändert , dass er keine Wagenrückläufe einführt , zumindest bisher beim Testen nur dieses Codes, der unten dargestellt ist. Ich müsste weitere Tests durchführen, um explizit zu sehen, wo der Fehler liegt, aber ich habe ihn neu codiert, um einen do shell script Befehl so zu verwenden, dass er in die Datei schreibt, ohne Wagenrückläufe einzuführen .

do shell script Ich habe jedoch die erste Umschreibung von Teil 4, die den Befehl verwendet, auskommentiert, da er zwar keine Wagenrückläufe einführt, jedoch bei jeder Ausführung eine leere Zeile am Ende der Zieldatei hinzufügt, und obwohl er nicht schwerwiegend ist, bin ich mir dennoch nicht sicher, ob Sie es tun. Ich möchte, dass es passiert. Also habe ich einen alternativen Weg hinzugefügt, der keinen do shell script Befehl verwendet .

Beachten Sie, dass ich für meine Variablen die CamelCase-Namenskonvention bevorzuge, also habe ich den gesamten Code neu geschrieben und zusätzlichen Code und Kommentare hinzugefügt , wie ich sie bevorzuge. Tut mir leid, wenn Ihnen das Unannehmlichkeiten bereitet, aber ich musste es auf eine Weise tun, die es mir ermöglicht, alle Probleme effektiv zu lösen. Fühlen Sie sich frei, nach Bedarf/Wunsch zu ändern.

Der folgende Code funktioniert mit der Zieldatei, unabhängig davon, ob sie anfänglich ASCII-Textinhalt enthält oder nicht, und ich habe auf meinem System nach mehreren Schreibvorgängen überprüft, dass keine Wagenrückläufe eingeführt wurden und die ursprüngliche Zieldatei zuerst überprüft wurde, ob leer oder nicht, hatte keine Im Vergleich zu anderen Codeversionen, die dieses Problem verursachten, wurden zu keinem Zeitpunkt Wagenrückläufe und keine Zeilenvorschübe konvertiert .

--    # Part 1 - Get and format today's date.

set todaysDate to (current date)
set y to text -4 thru -1 of ("0000" & (year of todaysDate))
set m to text -2 thru -1 of ("00" & ((month of todaysDate) as integer))
set d to text -2 thru -1 of ("00" & (day of todaysDate))

set formattedTodaysDate to y & "_" & m & "_" & d & " -" as string


--    # Part 2 - Get the first line of the target file.

set targetFilePathname to (POSIX path of (path to desktop as string) & "My Fruit Log.txt")

--    # Initialize firstLineOfFile variable in case the targetFilePathname file is empty.

set firstLineOfFile to ""
try
    --    # The commented line of code below is to be used when defining the actual code
    --    # in order to ensure a line feed "\n" is used and not a carriage return "\r".
    --    # Note that when compiled, the "\n" is converted to a literal newline
    --    # and a commented code line will be shown for all similiar instances.

    --    # set firstLineOfFile to first item of (read targetFilePathname using delimiter "\n")

    set firstLineOfFile to first item of (read targetFilePathname using delimiter "\n")
end try


--    # Part 3 - Check to see if the first line of the target file is today's date.

set isTodaysDateAlreadyWritten to false
if firstLineOfFile is equal to formattedTodaysDate then
    set isTodaysDateAlreadyWritten to true
end if


(*
--    # Part 4 - Write today's date to the first line of the target file, if necessary.

if isTodaysDateAlreadyWritten is equal to false then
    --    # set theTextToWrite to formattedTodaysDate & "\n"    
    set theTextToWrite to formattedTodaysDate & "\n"
    set theOriginalText to ""
    try
        set theOriginalText to (read targetFilePathname) as string
    end try
    --    # set theTextToWrite to theTextToWrite & "\n" & theOriginalText
    set theTextToWrite to theTextToWrite & "\n" & theOriginalText

    do shell script "echo " & quoted form of theTextToWrite & " > " & quoted form of targetFilePathname
end if
*)

--    # While the commented out Part 4 above does work by not introducing any carriage returns nonetheless
--    # it does introduce and additional empty line at the end of the target file and therefore will not be used.
--    #
--    # The following Part 4 does not use the do shell script command to make the writes nor does it add extra lines.


--    # Part 4 - Write today's date to the first line of the target file, if necessary.

if isTodaysDateAlreadyWritten is equal to false then
    --    # set theTextToWrite to formattedTodaysDate & "\n"    
    set theTextToWrite to formattedTodaysDate & "\n"
    set theOriginalText to ""
    try
        set theOriginalText to (read targetFilePathname) as string
    end try
    --    # set theTextToWrite to theTextToWrite & "\n" & theOriginalText
    set theTextToWrite to theTextToWrite & "\n" & theOriginalText
    try
        set referenceNumber to open for access targetFilePathname with write permission
        write theTextToWrite to referenceNumber starting at 0
        close access referenceNumber
    on error eStr number eNum
        display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with title "File I/O Error..." with icon caution
        try
            close access referenceNumber
        end try
        return
    end try
end if
Wenn ich Ihr wörtlich kopiertes Skript ausführe, wird mir eine Fehlermeldung angezeigt, die besagt: "Datei-E/A-Fehler ... Dateidatei My Fruit Log.txt ist bereits geöffnet. Nummer -49". Dies trotz der Tatsache, dass die Datei nicht geöffnet ist (und TextEdit nicht einmal ausgeführt wird), wenn ich das Skript ausführe. Ich kann nicht herausfinden, warum dieser Fehler ausgelöst wird. Selbst wenn die .txt-Datei geöffnet war, während ich das Skript ausführte (was nicht der Fall ist), warum sollte das das Skript daran hindern, die Datei zu lesen und in sie zu schreiben?
Okay, das ist sehr seltsam. Wenn ich das Skript von einem systemweiten Dienst aus führe (durch Klicken auf den Diensttitel im Menü Dienste gefunden, wenn Sie auf den aktuellen Anwendungstitel in der oberen linken Ecke des Bildschirms klicken), und selbst wenn die .txt-Datei wirklich ist geöffnet ist, wenn ich den Dienst ausführe , wird er erfolgreich ohne Fehler ausgeführt. Aber wenn ich den Code in Automator ausführe (indem ich auf das Play-Button-Dreieck mit der Bezeichnung „Run“ in der oberen rechten Ecke des Bildschirms klicke), wird mir immer dieser Fehler angezeigt.
@rubik's sphere, Dies ist ein Hauptgrund, warum eine ordnungsgemäße und angemessene Fehlerbehandlung verwendet werden muss. Sie denken vielleicht nicht, dass die Datei geöffnet ist, aber wenn Sie diesen Fehler erhalten, ist sie geöffnet! Übrigens bedeutet offen in diesem Fall nicht, dass es sichtbar oder minimiert ist, es bedeutet, dass ein Datei-Handle für diese Datei geöffnet ist. Dies bedeutet, dass open for accessdie Datei aufgetreten ist, aber nicht von geschlossen wurde close access .... Das heißt, bevor Sie meinen neuen Code ausgeführt haben, müssen Sie ausgeführt haben open for accessund das Dateihandle (Referenznummer) wurde nie geschlossen. Vielleicht aus dem anderen Code in der anderen Frage. Ich weiß, dass mein gegenwärtiger Code solide ist!
@rubiks Sphäre, ich habe diesen Code direkt aus meiner eigenen Antwort kopiert und mit oder ohne Vorhandensein der Zieldatei funktioniert er wie codiert und ohne Probleme, wenn er vom Skript-Editor ausgeführt wird. Ich kann + 86400 * 2der set todaysDate to (current date)Zeile hinzufügen und den Multiplikator nach jeder *Ausführung erhöhen, und es fügt der Datei das Datum des nächsten Tages hinzu, wie es soll. Sie müssen das Dateihandle schließen, um mit dem Zieldateinamen fortzufahren, oder den Dateinamen zum Testen ein wenig ändern, bis Sie das Dateihandle für diese benannte Datei schließen.
@rubiks Sphäre, ich habe dies im Skripteditor und Automator unter OS X 10.11.6 getestet und es funktioniert einfach! Selbst wenn ich AppleScript-Code in Automator verwenden werde, schreibe und teste ich ihn immer zuerst im Skripteditor und kopiere ihn dann in Automator. Nur wenige Male musste ich den Code in Automator ändern, abgesehen davon, was für den gesamten Arbeitsablauf erwartet wird .
Ich habe Automator.app beendet und dann Automator erneut geöffnet, und das Problem wurde sofort behoben. Ich war mit dieser Bedeutung von "offen" nicht vertraut; Ich hatte gedacht, dass der Fehler besagte, dass die Datei buchstäblich im Dock minimiert wurde oder so. Sie haben recht – das war eine schöne Lektion über den Wert der Fehlerbehandlung. Ich danke Ihnen für Ihre Hilfe. Du hast mir viel beigebracht.
Sehr verspätet … gemäß TN2065 (vgl. Wie erhält das Shell-Skript das Ergebnis? Wie gebe ich eine Shell-Variable an mein AppleScript zurück?) verwendet 'Shell-Skript ausführen' standardmäßig 'return' und fügt keine nachgestellte leere Zeile hinzu (vielleicht ein Legacy-Macintosh-Artefakt). Dies liegt an seinem Standardparameter „Zeilenenden ändern“ (den vielleicht niemand bewusst hinzufügt). Um ein typischeres unixy/modernes Verhalten zu sehen (dh Zeilenvorschub und eine nachgestellte leere Zeile), fügen Sie 'ohne Änderung der Zeilenenden' hinzu. Die ASLG verweist darauf – meiner Meinung nach schlecht – in ihrem Abschnitt Commands Reference.
@Mockman, RE: „Sehr verspätet … per TN2065“ – besser spät als nie! :) Zu der Zeit, als ich diese Antwort gepostet habe, kann ich mich nicht erinnern, ob ich diese TN gelesen hatte oder nicht, aber seitdem sicherlich. Vielen Dank, denn ein erneutes Lesen des TN schadet nie, um das Gedächtnis aufzufrischen.

Hallo, für Teil 2, ein Skript-Shell-Skript "head -n 1" ermöglicht es Ihnen, den Wert (Text) von Zeile 1 Ihrer Datei Ihrer Variablen FirstLineOfTxtFile zuzuweisen und dann Ihren Text wie gewünscht zu formatieren.

set TodayDate to current date
set y to text -4 thru -1 of ("0000" & (year of TodayDate))
set m to text -2 thru -1 of ("00" & ((month of TodayDate) as integer))
set d to text -2 thru -1 of ("00" & (day of TodayDate))
set FormattedTodayDate to y & "_" & m & "_" & d & " -"

set Target_Filepath to quoted form of ""/Users/Me/Desktop/Documents/My Fruit Log.txt""

set FirstLineOfTxtFile to do shell script "head -n 1 '"/Users/Me/Desktop/Documents/My Fruit Log.txt"'"
set TodayDateAlreadyWritten to false

if FirstLineOfTxtFile contains FormattedTodayDate then
    set TodayDateAlreadyWritten to true
end if


# Part 4
# Write today's date to the first line of the .txt file (if necessary).

if TodayDateAlreadyWritten = false then

    set TextToWrite to FormattedTodayDate & "
    "
    set OriginalText to quoted form of (do shell script "cat " & Target_Filepath)
    set TextToWrite to quoted form of TextToWrite & "
" & OriginalText
    do shell script "echo " & TextToWrite & " > " & Target_Filepath

end if
Da der von Ihnen bereitgestellte Code aufgrund von Fehlern nicht kompiliert werden kann, kann ich nur davon ausgehen, dass Sie ihn vor dem Posten nicht wirklich getestet haben!
@user3439894 Kann ich Sie ermutigen, entweder den Beitrag zu bearbeiten oder einen Kommentar zu verwenden, um genauer auf diese Fehler einzugehen?