¿Cómo puedo usar AppleScript para ver si una línea específica de un archivo .txt coincide con una variable?

1

Tengo un archivo .txt guardado en mi computadora. El contenido del archivo .txt se ve así, por ejemplo:

Quiero que mi aplicación Automator lea la línea primera del archivo .txt y ponga esa línea en una nueva variable. Esto es para que pueda comprobar si esta variable coincide con otra variable.

Mi objetivo final es que mi aplicación escriba automáticamente la fecha de hoy en la parte superior del archivo y agregue una línea en blanco adicional debajo de la fecha de hoy. Pero solo quiero que esto ocurra si la fecha de hoy no se ha escrito en el archivo, por supuesto.

Aquí está el código que tengo hasta ahora:

# 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 Parte 2 donde necesito ayuda.

Es posible que haya cometido algunos errores en alguna de las partes del código anterior (pero que yo sepa), así que siéntete libre de corregirme como mejor te parezca.

Estas son mis fuentes:

Parte 1: Formato de fechas cortas en AppleScript

Parte 4: Cómo prepararse para el texto archivo en AppleScript?

    
pregunta rubik's sphere 28.11.2016 - 06:02

2 respuestas

1

Bien, creo que he reducido el error 0D en relación con el uso de cat en el comando do shell script y he modificado el código para no introduce retornos de carro , al menos hasta ahora, solo este código se presenta a continuación. Tendría que hacer más pruebas para ver explícitamente dónde está el error. Sin embargo, lo he recodificado para utilizar un comando do shell script de manera que escriba en el archivo sin introducir retornos de carro .

Sin embargo, he comentado la primera reescritura de la Parte 4 que usa el comando do shell script porque, al no introducir retornos de carro , agrega una línea vacía al final del archivo de destino cada vez que se ejecuta y aunque no es fatal, no estoy seguro de que quiera que suceda. Por lo tanto, he agregado una forma alternativa de no usar un comando do shell script .

Tenga en cuenta que prefiero usar la convención de nomenclatura camelCase para mis variables, por lo que he reescrito todo el código agregando código y comentarios como yo los prefiero. Disculpe si esto le incomodó, sin embargo, tenía que hacerlo de una manera que me permitiera resolver eficazmente cualquier problema. Siéntase libre de modificar según sea necesario / deseado.

El código a continuación funciona en el archivo de destino, ya sea que inicialmente contenga o no contenido de texto ASCII y lo he verificado en mi sistema después de varias escrituras, no hay retornos de carro introducido y el archivo de destino original se verificó por primera vez, ya sea vacío o no, no tenía retornos de carro y no se convirtieron líneas de alimentación en ningún momento en comparación con otras versiones de código que causó este problema.

--    # 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
    
respondido por el user3439894 28.11.2016 - 06:57
0

Hola, para tu parte 2, un script de shell de script "head -n 1" te permitirá asignar el valor (texto) de la línea 1 de tu archivo a tu variable FirstLineOfTxtFile y luego formatear tu texto como lo deseas.

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
    
respondido por el meek 13.12.2016 - 14:35

Lea otras preguntas en las etiquetas