从Mathematica中的.raw文件中读取数据

时间:2012-07-24 14:19:10

标签: wolfram-mathematica plot

我正在尝试使用包含Mathematica中y坐标集的.raw文件绘制图表。我不确定要输入什么来直接引用文件中的数据 - 我目前正在使用'数据',我不确定这是否正确。

这是我的代码:

    SetDirectory[$HomeDirectory <> "/Documents/Project/Work/Output"]
    alldirs = FileNames["deBB-*"]
    alllocdata = {};
    Do[
       SetDirectory["./" <> alldirs[[idir]]];
       Print["--- working on " <> (dirname = alldirs[[idir]])];
       allfiles = FileNames["T-*.raw"];
       Do[
          Print["   --- working on " <> (filename = allfiles[[ifile]])];
          ReadList[filename, Number];
          AppendTo[alllocdata, data];
          Print[ListPlot[data, Frame -> True, PlotRange -> {0, 2000}, 
          DataRange -> {0, 10000},
          AxesOrigin -> {0, 0}]], {ifile, Length[allfiles]}
       ];
       SetDirectory[ParentDirectory[]],
       {idir, Length[alldirs]}
    ]

我一直收到这个错误:

    ListPlot::lpn: data is not a list of numbers or pairs of numbers. >>

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:3)

您的代码中的一个问题是您永远无法分配变量'data'。你可能的意思是

data = ReadList[filename, Number];

第二个问题是ReadList。这是相当古老的学校,虽然它可以工作,并且(大约10倍)比Import快。因为您正在将数字读作Number(...),所以您无需将它们转换为字符串。

第三个问题是AppendTo。这个命令非常慢。我建议采用索引方法。像

这样的东西
basdir = "~/parentdir";
SetDirectory[basdir];
alldir = FileNames["deBB-*"];
alldir = Select[alldir, DirectoryQ[#] &] (* directories only *);
alldat = Range[Length@alldir];
(
    SetDirectory[cdir = StringJoin[basdir, "/", alldir[[#]]]];
    Print["Working in ", cdir];
    allfil = FileNames["T-*.raw"];
    alldat[[#]] = Range[Length@allfil];
    tmpdat = Import[allfil[[#]], "Table"] & /@ Range[Length@allfil];
    alldat[[#]] = tmpdat;
    Print@ListPlot[tmpdat[[#]], PlotLabel -> allfil[[#]]] & /@ 
     Range[Length@allfil];
    ) & /@ Range[Length@alldir];

应该足够了。

答案 1 :(得分:1)

根据您的评论,data实际上是String,而不是数字数量。

data = "702.00000 704.00000 706.00000 708.00000"

通过查看输出Head[data]的{​​{1}}可以看出这一点。

要解析它,只需使用

String

而不是ToExpression@StringSplit@data 中的data

ListPlot

Mathematica graphics