2010-10-14 6 views
3

Je sais que cela est communément demandé, mais googler ne donne pas une réponse définitive pour Mathematica, alors j'ai pensé qu'il serait utile de l'avoir sur StackOverflow. Je l'ai fait avec Import, mais il m'est apparu que cela pourrait être terriblement inefficace, l'importation étant une fonction si lourde.Quelle est la meilleure façon de slurper le contenu d'un fichier dans une chaîne dans Mathematica?

La question est, pouvez-vous améliorer sur les points suivants:

slurp[filename_] := Import[filename, "Text"] 
+0

Non directement liée à votre question de performance, mais quelques fois j'ai eu besoin de slurp données XML et les fichiers d'aide ne sont pas utiles. Je l'ai trouvé, au cas où quelqu'un en aurait besoin http://www.hostsrv.com/webMathematica/Resources/Documentation/English/indexE_5_1.html. J'ai l'intention de poster une question de communauté pour construire un index des ressources de Mathematica. Il y a beaucoup de choses là-bas, mais trop dispersées. –

Répondre

2

Pour importer le fichier entier à la fois, la seule autre option que je suis au courant est ReadList. Il peut être cajolé de retourner le dossier complet en une seule chaîne comme suit :

In[1]:= ReadList["ExampleData/source", Record, RecordSeparators -> {}] 
Out[1]:= {"f[x] (: function f :)\r\ng[x] (: function g :)\r\n"} 

(Note:. \ R \ n sont effectivement interprétées dans la sortie, mais je les ai laissé pour une meilleure lisibilité) La clé est d'enlever RecordSeparators. Mais, honnêtement, je ne pense pas que cela vous sauve quoi que ce soit, et Import[ <file>, "Text"] est plus facile à écrire. Honnêtement, j'utilise Read[ <file>, String] lorsque j'ai des données dans un format qui n'est pas couvert par les spécificateurs de type utilisés dans Read et ReadList, et de construire une fonction personnalisée autour de cette opération pour charger dans toutes les données.


  1. Vous pouvez trouver cela dans le Reading Textual Data tutorial.
+0

Importer [fichier, "Chaîne"] utilise cette syntaxe ReadList [] pour aspirer le fichier. Vitesse sage, ceux-ci devraient être très similaires. Le format "Texte" effectue la normalisation de fin de ligne et gère peut-être les codages de caractères. –

+0

@Joshua, n'ayant pas vu moi-même le code sous-jacent, je suppose que vous avez raison concernant leurs vitesses relatives. Cela étant dit, la syntaxe 'Import' pour charger un fichier entier dans une chaîne est beaucoup plus simple, il est donc moins probable que des bogues soient introduits par son utilisation. D'un autre côté, mes données sont souvent structurées, mais pas d'une manière qui est traitée par 'Import',' Read', ou 'ReadList'. Donc, j'ai tendance à analyser les fichiers au fur et à mesure, plutôt que de les charger tous en même temps, puis de les analyser. – rcollyer

+0

votre utilisation de 'Read' et' ReadList' son très sensible. Ils prennent tous les deux des listes de types de données (comme une structure) que vous pourriez aussi trouver utiles. Idem pour leurs homologues binaires. –

Questions connexes