mathematica小技巧[2]--导入大数据
mathematica小技巧[2]--导入大数据
我们在使用mathematica处理数据时,一般会使用Import[]来导入数据,但是当我们有大量数据时,Import[]也会无能为力,因为在我们的内存中不能同时存储这么多的数据,那么此时,我们应该如何来解决呢,下面我们就来讲一下解决的方法。
我们使用的方法有点类似c中的文件指针,通过对文件流来做操作。我们来看一下要用到的函数。
OpenRead[]
OpenWriter[]
ReadLine[]
Close[] 关闭打开的流
我们来看一个具体的例子:
1.读取文件
首先打开一个文件,sr类似一个指向这个文件的指针
我们可以写一个While循环,来完成对整个文件的处理,对于一些中文文件,可能会出现字符编码错误,这时我们就要使用 FromCharacterCode[ToCharacterCode[rs], "UTF-8"],来将编码转换成utf-8的编码。
要注意:最后别忘了使用Close[指针名]来关闭我们打开的文件。
2.写入文件
同样,要想实现文件的写入,我们也只需要类似的步骤:
首先定义一个指针指向你要写入的文件
3.进度条
当然,有时我们需要一个进度条来告诉我们我们已经读取了多少了,这时我们就需要StreamPosition来告诉我们指针的位置,然后通过FileByteCount来获得全文的大小,然后比较两者的位置,即可显示出进度。
4.完整代码
5.完整例子
这个例子是我以前写的,可以看一下。
其实上面那段代码跑得挺慢的
好了,到这里也就差不多了,上面就是处理大数据时常用的办法,希望大家喜欢。
以上,所有
2017/3/4
我们使用的方法有点类似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
浙公网安备 33010602011771号