AppleScript: Comment écrire sur une ligne spécifique d'un fichier texte?

2

Exemple de contenu d'un fichier .txt sur mon Mac:

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

Je veux implémenter un sous-programme, comme ceci:

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

de sorte que le fichier texte ressemblerait par conséquent à ceci:

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.

Je sais que je peux obtenir le résultat souhaité en attribuant à chaque ligne du fichier texte son propre élément dans un listobjet AppleScript , comme suit:

set theIndividualLinesOfTextFileAsList to paragraphs of (read theFilepathOfTxtFile)

Je pourrais ensuite scinder le list, en fonction du numéro de ligne souhaité, puis le rajouter.

Mais existe-t-il une méthode plus efficace?

Mon vrai fichier .txt est beaucoup plus long que l'exemple de contenu ci-dessus.

la sphère de rubik
la source

Réponses:

3

Version éditée:

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
débloqué2412
la source
1

Je ne suis pas sûr que ce soit le moyen le plus efficace, mais cela permettra d'obtenir ce que vous recherchez. Fonctionne pour moi sur la dernière version de 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"
wch1zpink
la source
En testant cela, je n’avais qu’un seul document ouvert dans textedit donc le "document 1" fonctionnait. Si vous avez plusieurs documents ouverts, vous devrez peut-être modifier légèrement le code afin qu'il cible le bon document.
wch1zpink
J'ai oublié de mentionner que je veux écrire dans le fichier texte sans ouvrir le fichier. Le fichier ne sera jamais ouvert lors de l'exécution du script. Par conséquent, je recherche une méthode plus "en coulisses".
La sphère de rubik