mathematica小技巧[2]--导入大数据

mathematica小技巧[2]--导入大数据

  我们在使用mathematica处理数据时,一般会使用Import[]来导入数据,但是当我们有大量数据时,Import[]也会无能为力,因为在我们的内存中不能同时存储这么多的数据,那么此时,我们应该如何来解决呢,下面我们就来讲一下解决的方法。
 
  我们使用的方法有点类似c中的文件指针,通过对文件流来做操作。我们来看一下要用到的函数。
  OpenRead[]
  OpenWriter[]
  ReadLine[]
  Close[]                   关闭打开的流
 
  我们来看一个具体的例子:

1.读取文件
 
首先打开一个文件,sr类似一个指向这个文件的指针
path = SystemDialogInput["FileOpen", "此处可设置默认路径"];
sr = OpenRead[path, BinaryFormat -> True];
接着我们通过ReadLine[]来读取该文件的一行
我们可以写一个While循环,来完成对整个文件的处理,对于一些中文文件,可能会出现字符编码错误,这时我们就要使用 FromCharacterCode[ToCharacterCode[rs], "UTF-8"],来将编码转换成utf-8的编码。

要注意:最后别忘了使用Close[指针名]来关闭我们打开的文件。
rs = ReadLine[sr];
While[rs =!= EndOfFile,
 rs = ReadLine[sr];
 temp = FromCharacterCode[ToCharacterCode[rs], "UTF-8"];
...;
...;
]
Close[sr];
基本通过上面的方法,就可以实现对大文件的读取了。

2.写入文件

同样,要想实现文件的写入,我们也只需要类似的步骤:

首先定义一个指针指向你要写入的文件
sw = OpenWrite["文件地址",CharacterEncoding -> "UTF-8"];
接着使用WriteLine[]即可
WriteLine[sw, 你要写入的内容]
同样,最后也要关闭打开的流
Close[sw];
这样就完成了文件的写入。

3.进度条

当然,有时我们需要一个进度条来告诉我们我们已经读取了多少了,这时我们就需要StreamPosition来告诉我们指针的位置,然后通过FileByteCount来获得全文的大小,然后比较两者的位置,即可显示出进度。
fileLength = FileByteCount[path];
Dynamic[
 Row[{ StreamPosition[sr], "/", fileLength}]
 , UpdateInterval -> 2]


4.完整代码
path = SystemDialogInput["FileOpen", "此处可设置默认路径"];
sr = OpenRead[path];
rs = ReadLine[sr];

While[rs =!= EndOfFile,
 rs = FromCharacterCode[ToCharacterCode[rs], "UTF-8"];
 rs = StringSplit[rs, ","];
 
 (*处理语句块*)
 (*..........*)
 (*处理语句块*)
 rs = ReadLine[sr];
 ]
在处理语句块那里可以增加你想要处理的办法。下面我们来看一个完整的例子。

5.完整例子
这个例子是我以前写的,可以看一下。
path = SystemDialogInput["FileOpen", "此处可设置默认路径"];
sr = OpenRead[path, BinaryFormat -> True];
sw = OpenWrite["路径",CharacterEncoding -> "UTF-8"];
(*显示进度条*)
fileLength = FileByteCount[path];
Dynamic[
 Row[{ StreamPosition[sr], "/", fileLength}]
 , UpdateInterval -> 2]

(*定义时间间隔*)
uptime = TimeObject["13:30:00"];
downtime = TimeObject["16:30:00"];
judge = False;
(*把行标题写进去*)
rs = ReadLine[sr];
WriteLine[sw, rs]
While[rs =!= EndOfFile,
  rs = ReadLine[sr];
  temp = FromCharacterCode[ToCharacterCode[rs], "UTF-8"];
  (*分割后的字符串*)
  stringSplit = StringSplit[temp, ","];
  time = stringSplit[[3]];
  (*判断是否是日期格式--在判断是否落在时间区间内--是的话返回judge=true*)
  If[TimeObjectQ[time = TimeObject[time]],
   time = TimeObject[time];
   judge = (uptime < time < downtime);
   ];
  
  (*判断是否符合要求*)
  If[stringSplit[[-1]] == "\"餐费支出\"" && judge ,
   WriteLine[sw, temp]];
  judge = False;
  ];

Close[sw];
Close[sr];
这段代码当时是为了对学生卡的数据进行处理,找出其中在13:30:00到16:30:00中餐饮消费的情况。

其实上面那段代码跑得挺慢的

好了,到这里也就差不多了,上面就是处理大数据时常用的办法,希望大家喜欢。

下面还是讲一下我自己做的一个小作品。

下面链接是自己做的一个小作品,是用来学习汉字结构的,我们将汉字的结构具体展现出来了,摆脱了以往汉字教学中的模糊概念,希望大家可以看看多提提意见。

汉字结构学习

以上,所有
2017/3/4







posted on 2017-03-04 18:45  WMN7Q  阅读(483)  评论(0编辑  收藏  举报

导航