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

来源:互联网 发布:出国旅游的好处知乎 编辑:程序博客网 时间:2024/06/05 09:45
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







0 0