将数据从 txt 导入 Mathematica

Posted

技术标签:

【中文标题】将数据从 txt 导入 Mathematica【英文标题】:Import data from txt to Mathematica 【发布时间】:2011-09-07 16:08:09 【问题描述】:

考虑mathematica中的以下列表:

a = 
   
    0, 0, 0, 1, 0, 0, 1, 1, 0
    ,
   
    0, 0, 1, 1, 0, 1, 1, 1, 1
    
   ;

现在,调用:

Export["test.dat", a]

然后

b = Import["test.dat"]

你会看到最后a 不等于b。我应该将此视为功能还是错误?

此外,我想导入一个具有以下格式的列表:P1,P2,P3...,Pn 其中Pi=v1,v2,v3,...,vm 和每个vi=x,y,z 其中x,y,z 是代表顶点坐标vi 的数字。这应该是一个多边形列表。

我应该如何设置我的.dat 文件以便我可以使用 Mathematica 读取它,我应该如何读取它?我试图模仿上面Export["test.dat",a] 的输出,但后来我发现了另一个问题。我找到了这个question,但无法让答案对我有用...

有什么想法吗?提前致谢!

【问题讨论】:

【参考方案1】:

您应该指定您需要导入/导出的确切格式,否则 Mathematica 可能无法猜出正确的格式。

所以您的问题归结为哪种文本格式适合存储 3D 数组?

如果您使用 Mathematica,可能最简单的方法是使用 Mathematica 的表达式语法导出表达式,即Export["data.m", a, "Package"]。这种格式相对容易从其他语言编写(但并不容易解析)。您的另一个选择是为您的 3D 数据创建一些易于解析的新文本格式,并使用 Mathematica 和您需要使用的其他语言为其编写自己的输入/输出函数。

由于您正在使用的数据格式是固定的(您总是有坐标三元组),最简单的解决方案可能是在导出之前展平您的列表,并在导入后对其进行分区,如下所示:

Export["test.txt", Join @@@ a, "Table"]
b = Import["text.txt", "Table"]
Partition[#, 3]& /@ a

【讨论】:

通过模仿Export["data.m", a, "Package"] 的输出,我设法做我想做的事。谢谢! @Dror,我认为您还需要使用其他软件读取数据文件。如果不是这种情况,而您只需要临时存储/保存数据,则“WDX”格式的导入/导出可能比“Package”快得多。但它是二进制的,因此您将无法使用文本编辑器检查它或将其导入其他程序。 “WDX”还可以存储任何类型的 Mathematica 表达式(我认为)。【参考方案2】:

对于存储 MMA 表达式,我建议使用 DumpSave(二进制,取决于系统)、SavePut,但如果您想使用 Export,我会将 a 转换为 字符串 ,并将其导出为 text。 (我在下面使用ImportStringExpertString,所以我不需要文件,但它对ImportExport 的工作方式相同)。国际海事组织这是坚如磐石。

a = 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1;
b = ToExpression@ImportString[ExportString[a // ToString, "Text"], "Text"]

(*  ==>
0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1
*)

a == b

(* ==> True *)

阅读你的多边形列表应该是一样的:

b = ToExpression@ImportString["test.dat", "Text"]

【讨论】:

这与导出到“包”有何不同?实际上,我刚刚发现了导出为“包”格式(.m 文件)的可能性,但似乎也差不多。 @Szabolcs 我没有最模糊的想法,因为我也不知道导出到包选项。我现在已经研究了这种能力,我觉得“包”是要走的路(如果你不介意文件开头的 Wolfram 注释)。例如,如果您导出实数,“文本”选项会导出 6 位格式,而“包”使用完整的精度。【参考方案3】:

你也可以这样做:

a=0,0,0,1,0,0,1,1,0,0,0,1,1,0,1,1,1,1;

Export["c:\\test.dat",a,"MathML"];
b=ToExpression@Import["c:\\test.dat","MathML"]

(*
->0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1
*)

额外的好处是这种方法不需要解析Import输出

【讨论】:

虽然这个适用于这个特定的例子,但对我来说它看起来真的很老套和脆弱。这基本上是构建一个 MathML 表达式,当渲染时,看起来或多或少像 Mathematica 表达式,然后重新导入它。只能希望重新导入的版本是相同的......如果我们采用这种方法,最好使用非易碎格式,比如只使用表达式的 InputForm(这就是导出到“包“格式确实)。据我所知,“MathML”对此没有优势,只有劣势。 @Szabolcs 由于问题范围是Import data from txt to Mathematica,我认为这种方式是合适且有效的。 OP 不适用于expressions,而只能使用结构为列表的data 然而,MathML 设计用于(两者)交换和格式化数学表达式,而不是列表或数组。可以认为这是一个意外,它没有问题......为什么你认为 MathML 比所有其他人类可读的可能性(如 InputForm(“Package”)、ExpressionML 等)更适合表示数组?跨度> @Szabolcs 我没有说更好。它只是工作。但它(恕我直言)比在导出前加入和导入后分区要好。【参考方案4】:

我也遇到了这个问题。我的解决方案如下:

IN[]: a = 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1;
      Export["test.dat", a, "List"];
      b = ToExpression@Import["test.dat", "List"];
      a == b

Out[]: True

希望这会有所帮助。最好的问候。

【讨论】:

以上是关于将数据从 txt 导入 Mathematica的主要内容,如果未能解决你的问题,请参考以下文章

PHP 将数据从TXT文件导入Mysql

将数据从 txt 文件导入 IBM netezza SQL 数据库的错误

将数据从TXT文件导入Mysql

使用 PL/SQL 将数据从 file.txt 导入 Oracle SQL 表

将数千条记录从单个 txt 文件导入数据库 MySQL 的更快方法?

由于日期格式,将数据从 txt 文件导入 IBM netezza SQL 数据库时出错