AppleScript: come scrivere su una riga specifica di un file di testo?


2

Contenuti di esempio di un file .txt sul mio Mac:

This is sentence A.
This is sentence B.
This is sentence C.
This is sentence D.
This is sentence E.

Voglio implementare una subroutine, come questa:

writeTextAtSpecificLine(("This is the newcomer sentence." & linefeed), 4)

in modo che, di conseguenza, il file di testo sia simile al seguente:

This is sentence A.
This is sentence B.
This is sentence C.
This is the newcomer sentence
This is sentence D.
This is sentence E.

So che posso ottenere il risultato desiderato rendendo ogni riga del file di testo il proprio elemento in un listoggetto AppleScript , in questo modo:

set theIndividualLinesOfTextFileAsList to paragraphs of (read theFilepathOfTxtFile)

Potrei quindi dividere il list, in base al numero di riga desiderato, e quindi aggiungere nuovamente tutto insieme.

Ma esiste un metodo più efficiente?

Il mio vero file .txt è molto più lungo del contenuto di esempio sopra.

Risposte:


3

Versione modificata:

set selected_file to ((path to documents folder as text) & "hom.txt") as alias
set text_data to "This is the newcomer sentence."

InsertLine(selected_file, text_data, 4)

on InsertLine(the_file, the_data, num_line)
    try
        set file_id to open for access the_file with write permission
        set text_data to read file_id

        -- CHECK EMPTY LINE
        if (paragraph num_line of text_data)  "" then
            set the_offset to (offset of (paragraph num_line of text_data) in text_data) - 1
            set remaining_data to (the_data) & (text the_offset thru -1) of text_data
            set eof of file_id to the_offset
        else -- LINE IS EMPTY
            set num_line to num_line - 1
            set the_count to (count of (characters of (paragraph num_line of text_data))) - 1
            set the_offset to (offset of (paragraph num_line of text_data) in text_data) + the_count + 2
            set remaining_data to the_data & linefeed & ((text (the_offset + 1) thru -1) of text_data)
            set eof of file_id to the_offset - 1
        end if

        -- WRITE DATA TO FILE
        --write the_data to file_id -- INSERT LINE
        write remaining_data to file_id -- WRITE REMAINING DATA
        close access file_id
    on error
        try
            close access the_file
        end try
    end try
end InsertLine

1

Non sono sicuro che questo sia il modo più efficiente, ma questo realizzerà ciò che stai cercando. Funziona per me sull'ultima versione di Sierra

tell application "TextEdit" to make new paragraph at after third paragraph of text of document 1 with data "This is the newcomer sentence. \n"

Durante il test, avevo solo un documento aperto in textedit quindi "documento 1" funzionava. Se hai diversi documenti aperti, potrebbe essere necessario modificare leggermente il codice in modo che sia indirizzato al documento corretto.
wch1zpink,

Ho dimenticato di dire che voglio scrivere nel file di testo senza aprire il file. Il file non sarà mai aperto quando viene eseguito lo script. Quindi, sto cercando un metodo più "dietro le quinte".
sfera di rubik,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.