什么是在Mathematica中将文件内容读入字符串的最佳方法?

3

我知道这是一个常见的问题,但在 Mathematica 上搜索并没有得出明确的答案,所以我认为将其放在 StackOverflow 上会很有价值。

我一直在使用 Import 进行操作,但我意识到这可能非常低效,因为 Import 是一个重量级函数。

那么问题是,你能否改进以下代码:

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

不直接涉及您的性能问题,但有几次我需要读取XML数据,但帮助文件并没有提供帮助。我找到了这个链接,如果有人需要的话:http://www.hostsrv.com/webMathematica/Resources/Documentation/English/indexE_5_1.html。我计划发布一个社区问题,建立一个Mathematica资源索引。虽然有很多资源,但它们太分散了。 - Dr. belisarius
1个回答

2

如果要一次性导入整个文件,我所知道的另一个选项是ReadList。可以使用以下方式将其转换为返回整个文件作为单个字符串:

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

注意:\r和\n实际上在输出时被解释,但为了可读性而保留。关键是去除任何RecordSeparators。但是,我认为这并没有节省太多的时间,而且Import[,“Text”]更容易编写。老实说,当我有一个不包含在Read和ReadList使用的类型说明符中的格式的数据时,我会使用Read[,String],并围绕此操作构建自定义函数来加载所有数据。
  1. 您可以在读取文本数据教程中找到此内容。

Import[file, "String"] 使用这个 ReadList[] 语法来读入文件。就速度而言,它们应该非常相似。 "Text"格式会进行行结尾规范化,可能还会处理字符编码。 - Joshua Martell
@Joshua,我没有看过底层代码,但我认为你对它们的相对速度是正确的。话虽如此,使用“Import”语法将整个文件加载到字符串中要简单得多,因此使用它不太可能引入错误。另一方面,我的数据通常是结构化的,但不是由“Import”,“Read”或“ReadList”处理的方式。因此,我倾向于边读取文件边解析,而不是一次性加载所有文件然后解析。 - rcollyer
你对 ReadReadList 的使用听起来非常明智。它们都接受数据类型列表(如结构体),你可能也会发现它们很有用。同样适用于它们的二进制对应项。 - Joshua Martell
@Joshua,是啊,我尽量使用它。但是,如果一些文本是标记,严格来说并不是数据,那么它就不那么有用了。个人而言,我希望能够定义导入/导出可以使用的文件格式,以便我使用的文件格式可以与内置类型平等对待。 - rcollyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接