公告:1)网站程序升级:Q2A升级到1.8.6,Wordpress升级到5.7.2
2)修复了头像加载慢与提交问题反应慢等问题
2021-06-16

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

+2 投票
1.5k 浏览
数据保存在csv中,使用Import会提示内存不足,那么怎么样才可以处理文件中的数据。

 

*************

我暂时用的方法是 分批导入处理,问一下有什么更好的办法
分类:导入导出 | 用户: WMN7 (606 分)
重新分类 用户:野鹤
要不弄个简化的CSV上传附件来给我们测试一下?
不知道怎么上传文件,下面给一个网址,里面有数据

给一个网址,这里是去年一道数据挖掘的题目(已经结束)

http://www.tipdm.org/qk/729.jhtml

里面的c题的数据我就无法处理

2 个回答

+4 投票
 
已采纳

对于几百兆及以上大小的csv数据或日志文件等文件数据,不建议使用Import直接导入(上限貌似是512M,但即使是二三百兆也不建议使用Import)。

 

对于大文件数据,可以先通过底层文件操作方式打开文件,以流的方式处理,对原始数据进行整理汇总。

然后,对整理汇总之后的数据就可以使用Mma的各种强大函数了。

 

常用的底层文件操作函数:在帮助中搜索“guide/LowLevelFileOperations”


贴个例子

path = SystemDialogInput["FileOpen", "此处可设置默认路径"];
sr = OpenRead[path];
rs = ReadLine[sr];
(*先读入一行。如果有非ASCII字符,参考FromCharacterCode和ToCharacterCode*)

While[rs =!= EndOfFile,
 rs = StringSplit[rs, ","];
 (*处理语句块*)
 (*..........*)
 (*处理语句块*)
 rs = ReadLine[sr];
 ]

下面这个包含处理进度:

path = SystemDialogInput["FileOpen", "此处可设置默认路径"];
sr = OpenRead[path];
fileLength = FileByteCount[path];
Dynamic[Column[{Row[{Floor[100 StreamPosition[sr]/fileLength], "%"}], 
   ProgressIndicator[StreamPosition[sr]/fileLength]}]]
rs = ReadLine[sr];
(*先读入一行。如果有非ASCII字符,参考FromCharacterCode和ToCharacterCode*)

While[rs =!= EndOfFile,
 rs = StringSplit[rs, ","];
 (*处理语句块*)
 (*..........*)
 (*处理语句块*)
 rs = ReadLine[sr];
 ]

 

用户: 野鹤 (5.0k 分)
采纳于 用户:WMN7
十分感谢。说一下我遇到的问题

我是10.2的版本

1.
在OpenRead[] 这里我要使用sr = OpenRead[path, BinaryFormat -> True];
否则默认的是False,后面的无法正常执行

2.
想问一下 =!=是什么意思
我在这里执行csv文件会一直读下去,就是把空白的行也读进去了
1.详见帮助:设置选项 BinaryFormat->True 时,数据流以二进制格式打开,因此不实现任何新行或其它数据的文本解释.
2.=!=和!=都是不等于的意思,两者区别:前者直接判断左右表达式是否相等,后者先计算左右表达式,再判断左右表达式的结果是否相同。其实这里用!=一般也没有问题。
比如,对于未赋值的x和y,下面的结果不同:
x =!= y
x != y
————
抱歉,代码写的有点问题,判断rs是否等于EndOfFile时rs应该是ReadLine的直接结果。已经修改了。
我感觉你上面的代码有点小问题
——————————
因为在csv文件末尾都出来就是EndOfFile,无法执行StringSplit[ ","]
——————————
我把我改的代码放在下面

使用If来判断是否到末尾,是的话就用Break跳出循环




]
嗯。正是这里有问题,代码我已经修改过了。
我把改了的放在下面了,我试了一下,应该没有问题
0 投票
path = SystemDialogInput["FileOpen", "此处可设置默认路径"];
sr = OpenRead[path, BinaryFormat -> True];
rs = StringSplit[ReadLine[sr], ","];
Print[rs];
(*如果有非ASCII字符,可能需要设置编码,参考FromCharacterCode和ToCharacterCode*)
While[True,
 rs = ReadLine[sr];
 If[Not[rs =!= EndOfFile], Break[]];
 (*处理语句块*)
 rs = StringSplit[rs, 
   ","];(*如果有非ASCII字符,可能需要设置编码,参考FromCharacterCode和ToCharacterCode*)
 Print[rs]
 ]
Close[sr];

就改了一点

用户: WMN7 (606 分)
If[Not[rs =!= EndOfFile], Break[]];
可以这样写:If[rs === EndOfFile, Break[]];
嗯,试了一下,这样也可以。

————————————

我对这些符号不是很了解,要去看一下帮助文档
...