Mathematica:为几个文件做同样的事情(Import,Take,...)

时间:2013-01-24 14:47:31

标签: file automation wolfram-mathematica mathematica-8

我目前正致力于使用Mathematica处理一些实验数据。

我有几个文件,我基本上想要做同样的事情。目前,我只是复制并粘贴所有内容并更改文件名,如下所示:

rechn1 = Import[
   "/path/4He.H2O.MeV14460.ddd.gd.dat", "Table"];
r1 = Length[rechn1];
rechn1a = Take[rechn1, {9, r1}];
plotr1 = ListPlot[rechn1a]

rechn2 = Import[
   "/path/4He.H2O.MeV15000.ddd.gd.dat", "Table"];
r2 = Length[rechn2];
rechn2a = Take[rechn2, {9, r2}];
plotr2 = ListPlot[rechn2a]

rechn3 = Import[
   "/path/4He.H2O.MeV15670.ddd.gd.dat", "Table"];
r3 = Length[rechn3];
rechn3a = Take[rechn3, {9, r3}];
plotr3 = ListPlot[rechn3a]

等等。 我对Mathematica并不是特别精通,所以这对我来说似乎是个不错的选择。复制,粘贴,更改一些数字。

但是,我现在必须处理更多这样的数据。那么,有没有办法告诉Mathematica以某种方式处理所有文件?也许还要改变一些细节?例如,处理所有相同的内容,但绘图的PlotStyle或标题不同?

找到一种自动化这个过程的方法会很棒,因为我现在有很多文件要处理,复制和粘贴不再是一个选项。

谢谢!

1 个答案:

答案 0 :(得分:0)

与Mathematica一样,有多种方法可以做你想做的事。以下是您可以组装成适合您的解决方案的一些部分。

你可以用它们的组合替换你的4个函数调用序列,如下所示:

ListPlot[Drop[Import["/path/4He.H2O.MeV15670.ddd.gd.dat", "Table"], 9]]

这最初很难解释(对你而言,Mathematica不会有问题),但在后面的内容中使用它会更容易,并且它将避免使用不必要的临时变量使工作区混乱。请注意,我已将Take[expr,{9,Length[expr]}]替换为等效的Drop[expr,8],以避免在导入的数据文件上调用Length

现在我们可以把它整理成一个函数,例如:

makePlot[fn_String] := ListPlot[Drop[Import[fn, "Table"], 8]]

接下来,让我们获取您需要的所有文件名。我想您当前的工作目录是“/ path”的父级和调用

hefiles = FileNames["4He.*.ddd.gd.dat", {"*"}, Infinity];

将返回所有输入文件的名称列表。让我们修改makePlot函数的原因将会在一瞬间变得明显:

makePlot[ix_Integer, fn_String] := myPlots[ix] = ListPlot[Drop[Import[fn, "Table"], 9]];

现在,你可以写

Do[makePlot[i,heFiles[[i]]],{i,1,Length[heFiles}]

这应该是,如果我的语法正确并且匹配了所有括号,那么用一个语句来制作你的所有情节。它们现在将存储为myPlots[1], myPlots[2], ...

如果您想为ListPlot命令设置选项,只需将makePlot的定义修改为类似

的内容
makePlot[fn_String] := ListPlot[Drop[Import[fn, "Table"], 8],plotOption-> setting, plotOption2->setting2]

或者,如果您希望在Mathematica知识中实现跨越式发展,请调查Options函数,并修改makePlot以将选项作为(可选)参数并将其传递给{{ 1}}。