2017-02-17 1 views
1

J'ai vraiment du mal à trouver de la documentation sur la façon de lire un fichier texte dans un tableau en utilisant OS X Automation avec Javascript.Lire un fichier texte dans un tableau avec OS X Javascript

Voici ce que j'ai jusqu'à présent:

var app = Application.currentApplication(); 
app.includeStandardAdditions = true; 

var myFile = "/Users/Me/Dropbox/textfile.txt"; 
var openedFile = app.openForAccess(myfile, { writePermission: true }); 

var myText = openedFile.?? 

app.closeAccess(URLFile); 

j'ai copié la plupart de ces documents de la Apple officielle. Je trouve vraiment difficile de trouver de la documentation partout en ligne. Par exemple, quels sont les arguments pour openForAccess? Il ne semble y avoir rien dans un dictionnaire pour décrire cette méthode. Est-ce que je perds mon temps avec JXA?

+0

Pour l'automatisation des applications, AppleScript est le seul option prise en charge qui fonctionne correctement et qui dispose de la documentation et du support de la communauté. Pour les autres tâches, si vous pouvez utiliser Python, Ruby, Swift ou tout autre langage activement géré et doté d'une communauté d'utilisateurs en bonne santé, faites-le. JXA a été effectivement non corrigé et non supporté dès le premier jour de son lancement. Il n'a donc pas réussi à gagner des parts de marché, ce qui a abouti à l'abandon du gestionnaire de produits Automation et à l'élimination de l'équipe Mac Automation l'année dernière. . – foo

+0

JXA est un instrument très utile. – houthakker

Répondre

0

Apple a an entire page consacré à la lecture et à l'écriture de fichiers dans son Guide de scripts Mac Automation. Cela inclut une fonction qui effectue exactement l'action que vous recherchez. J'ai réécrites votre exemple ci-dessous en utilisant la fonction readAndSplitFile du guide d'Apple:

var app = Application.currentApplication() 
app.includeStandardAdditions = true 

function readAndSplitFile(file, delimiter) { 
    // Convert the file to a string 
    var fileString = file.toString() 

    // Read the file using a specific delimiter and return the results 
    return app.read(Path(fileString), { usingDelimiter: delimiter }) 
} 

var fileContentsArray = readAndSplitFile('/Users/Me/Dropbox/textfile.txt', '\n') 

Après avoir exécuté le code ci-dessus, fileContentsArray tiendra un tableau de chaînes, chaque chaîne containg une seule ligne du fichier. (Vous pouvez également utiliser \t comme séparateur pour briser à chaque onglet, ou tout autre caractère de votre choix.)

1

Certaines fonctions génériques et un test d'illustration:

(function() { 
    'use strict'; 

    // GENERIC FUNCTIONS ------------------------------------------------------ 

    // doesFileExist :: String -> Bool 
    function doesFileExist(strPath) { 
     var error = $(); 
     return $.NSFileManager.defaultManager 
      .attributesOfItemAtPathError($(strPath) 
       .stringByStandardizingPath, error), error.code === undefined; 
    }; 

    // lines :: String -> [String] 
    function lines(s) { 
     return s.split(/[\r\n]/); 
    }; 

    // readFile :: FilePath -> maybe String 
    function readFile(strPath) { 
     var error = $(), 
      str = ObjC.unwrap(
       $.NSString.stringWithContentsOfFileEncodingError($(strPath) 
        .stringByStandardizingPath, $.NSUTF8StringEncoding, error) 
      ), 
      blnValid = typeof error.code !== 'string'; 
     return { 
      nothing: !blnValid, 
      just: blnValid ? str : undefined, 
      error: blnValid ? '' : error.code 
     }; 
    }; 

    // show :: a -> String 
    function show(x) { 
     return JSON.stringify(x, null, 2); 
    }; 

    // TEST ------------------------------------------------------------------- 
    var strPath = '~/DeskTop/tree.txt'; 

    return doesFileExist(strPath) ? function() { 
     var dctMaybe = readFile(strPath); 
     return dctMaybe.nothing ? dctMaybe.error : show(lines(dctMaybe.just)); 
    }() : 'File not found:\n\t' + strPath; 
})();