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