Come posso utilizzare AppleScript per vedere se una riga specifica di un file .txt corrisponde a una variabile?

1

Ho un file .txt salvato sul mio computer. Il contenuto del file .txt ha questo aspetto, ad esempio:

Voglio che la mia applicazione Automator legga la riga prima del file .txt e che inserisca quella linea in una nuova variabile. Questo è così che posso verificare se questa variabile corrisponde a un'altra variabile.

Il mio obiettivo finale è di far scrivere automaticamente la data di oggi nella parte superiore del file e aggiungere una riga vuota al di sotto della data di oggi. Ma voglio solo che ciò accada se la data odierna non è già stata scritta sul file, naturalmente.

Ecco il codice che ho finora:

# 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

È Parte 2 dove ho bisogno di assistenza.

Potrei aver commesso alcuni errori in una qualsiasi delle parti del codice di cui sopra (ma non a mia conoscenza), quindi per favore sentiti libero di correggermi come meglio credi.

Queste sono le mie fonti:

Parte 1: Formattazione di brevi date in AppleScript

Parte 4: Come anteporre al testo file in AppleScript?

    
posta rubik's sphere 28.11.2016 - 06:02
fonte

2 risposte

1

Ok, credo di aver ristretto il bug 0D in relazione all'uso di cat nel comando do shell script e ho modificato il codice così non presenta ritorni a capo , almeno finora nel test solo questo codice presentato di seguito. Dovrei fare ulteriori test per vedere in modo esplicito dove il bug è comunque l'ho ricodificato per usare un do shell script comando in un modo per scrivere sul file senza introdurre ritorni a capo .

Comunque ho commentato la prima riscrittura della Parte 4 che usa il do shell script comando perché mentre non introduce ritorni a capo aggiunge una riga vuota al fine del file di destinazione ogni volta che viene eseguito e, sebbene non sia fatale, non sono sicuro che vorresti che succedesse. Quindi, ho aggiunto un modo alternativo per non utilizzare un do shell script comando .

Nota che preferisco usare la convenzione di denominazione camelCase per le mie variabili, quindi ho riscritto tutto il codice aggiungendo ulteriori code e commenti come li preferisco. Scusa se questo inconveniente ti ha comunque dovuto farlo in un modo che mi permettesse di risolvere efficacemente qualsiasi problema. Sentiti libero di modificare come necessario / desiderato.

Il codice sotto funziona sul file di destinazione anche se inizialmente contiene contenuto di testo ASCII e ho verificato sul mio sistema dopo più scritture che non ci sono ritorni a capo introdotto e il file di destinazione originale è stato prima verificato, sia vuoto o no, non ha avuto ritorni a capo e nessun feed di riga è stato convertito in qualsiasi momento rispetto ad altre versioni di codice che ha causato questo 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
    
risposta data 28.11.2016 - 06:57
fonte
0

Ciao, per la tua parte 2, uno script di shell script "head -n 1" ti permetterà di assegnare il valore (testo) della riga 1 del tuo file alla tua variabile FirstLineOfTxtFile e poi di formattare il testo come Desiderate.

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
    
risposta data 13.12.2016 - 14:35
fonte

Leggi altre domande sui tag