找回密码
 注册
Simdroid-非首页
查看: 615|回复: 20

关于批量导入数据的方法

[复制链接]
发表于 2008-11-13 14:28:48 | 显示全部楼层 |阅读模式 来自 黑龙江哈尔滨
求助各位高手!
现在我有很多以txt为后缀的文本数据,都是相同数量的行和列,现在有两个问题请教!
1.例如文件都是AAA1.txt,AAA2.txt~AAA2000.txt 为命名,严格按照递增排列。请问怎样才能高效的导入这些数据,使每个数据对应一个矩阵;
2.我想在上述每个矩阵中,提取相同位置的数据,再次拼接成一个新矩阵,又该怎样执行才较快?

多谢各位高手,大牛!
发表于 2008-11-13 14:55:48 | 显示全部楼层 来自 北京
Simdroid开发平台
原帖由 zhaobo_ren 于 2008-11-13 14:28 发表
求助各位高手!
现在我有很多以txt为后缀的文本数据,都是相同数量的行和列,现在有两个问题请教!
1.例如文件都是AAA1.txt,AAA2.txt~AAA2000.txt 为命名,严格按照递增排列。请问怎样才能高效的导入这些数据,使 ...


load,  uigetfile都可以实现类似的功能
如果是excel存的,还可以用xlsread
关于uigetfile可看帮助或仔细阅读下面贴子的链接
http://forum.simwe.com/thread-848120-1-10.html

举个load的例子
假设有数据文件,data1.txt和data2.txt
其中存放的分别是5X5的矩阵数据为
data1:    0.8147    0.0975    0.1576    0.1419    0.6557
             0.9058    0.2785    0.9706    0.4218    0.0357
             0.1270    0.5469    0.9572    0.9157    0.8491
             0.9134    0.9575    0.4854    0.7922    0.9340
             0.6324    0.9649    0.8003    0.9595    0.6787
data2:
             0.7577    0.7060    0.8235    0.4387    0.4898
             0.7431    0.0318    0.6948    0.3816    0.4456
             0.3922    0.2769    0.3171    0.7655    0.6463
             0.6555    0.0462    0.9502    0.7952    0.7094
             0.1712    0.0971    0.0344    0.1869    0.7547
你想将其读入,并提取其中的2、3、4行,4、5列中的内容
并组成一个新的矩阵可如下编程:
  1. a=load('data1.txt')
  2. b=load('data2.txt')
  3. c=[a(2:4,4:5) b(2:4,4:5)]
  4. 执行后,结果为:
  5. a =
  6.     0.8147    0.0975    0.1576    0.1419    0.6557
  7.     0.9058    0.2785    0.9706    0.4218    0.0357
  8.     0.1270    0.5469    0.9572    0.9157    0.8491
  9.     0.9134    0.9575    0.4854    0.7922    0.9340
  10.     0.6324    0.9649    0.8003    0.9595    0.6787
  11. b =
  12.     0.7577    0.7060    0.8235    0.4387    0.4898
  13.     0.7431    0.0318    0.6948    0.3816    0.4456
  14.     0.3922    0.2769    0.3171    0.7655    0.6463
  15.     0.6555    0.0462    0.9502    0.7952    0.7094
  16.     0.1712    0.0971    0.0344    0.1869    0.7547
  17. c =
  18.     0.4218    0.0357    0.3816    0.4456
  19.     0.9157    0.8491    0.7655    0.6463
  20.     0.7922    0.9340    0.7952    0.7094
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2008-11-13 15:22:59 | 显示全部楼层 来自 黑龙江哈尔滨

回复 2# ljelly 的帖子

我又看了一遍版主的回复,发现这个问题并不在于其怎么算,而是怎样更高效的调用和拼接矩阵。
我的数据是txt文件,用load可以单独调用每一个文件,但我有上千个文件,怎样把那个AAA1.txt之类数据命名中的数字1循环起来,才是我最关心的!这个文件从AAA1.txt到AAA2000.txt,共2000个。只用load要复制2000遍。还是极其繁琐,该怎样解决这个问题呢?还请版主赐教
回复 不支持

使用道具 举报

发表于 2008-11-13 15:40:44 | 显示全部楼层 来自 陕西西安
用 num2str:
for i = 1:2000
        s = ['AAA' num2str(i) '.txt'];
        load s
end

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2008-11-13 15:44:23 | 显示全部楼层 来自 大连理工大学
呵呵,我这里正好有篇论文,给你提供一下,不知道对你有没有用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2008-11-13 16:05:07 | 显示全部楼层 来自 黑龙江哈尔滨

回复 5# kokyo52 的帖子

呵呵,不瞒兄台,我就是这么干的!效率很低!
回复 不支持

使用道具 举报

 楼主| 发表于 2008-11-13 16:06:06 | 显示全部楼层 来自 黑龙江哈尔滨

回复 6# zhoulon 的帖子

谢谢这位版主!我先看看!
另外就是那个问题2,我还是不知道该怎样才能高效大批量处理,还请指教!
回复 不支持

使用道具 举报

发表于 2008-11-13 16:08:10 | 显示全部楼层 来自 北京
原帖由 kokyo52 于 2008-11-13 15:40 发表
用 num2str:
for i = 1:2000
        s = ['AAA' num2str(i) '.txt'];
        load s
end


你只不过是用了循环,次数与一个个执行没有太大的区别
要是不用循环,效率会高一些
看看zhoulon提供的资料是不是有更好的方法
回复 不支持

使用道具 举报

 楼主| 发表于 2008-11-13 16:11:43 | 显示全部楼层 来自 黑龙江哈尔滨

回复 6# zhoulon 的帖子

文章看完了,里面说的是一次导入大量数据,而我想实现的是多次海量导入数据,这个次数太多了,按照论文里说的话,光点击鼠标就要上万次!还请各位高手指点!
回复 不支持

使用道具 举报

发表于 2008-11-13 16:41:29 | 显示全部楼层 来自 浙江杭州
你每个文件多大的,可以用textread,一次不读取那么多进来。另外可以考虑使用Memory-Mapping,应该比直接load或者textread什么的快一点,只是这个方面我也刚刚接触,不熟悉,你自己看看帮助文档吧。

[ 本帖最后由 feynmand 于 2008-11-13 17:05 编辑 ]
回复 不支持

使用道具 举报

 楼主| 发表于 2008-11-13 16:46:13 | 显示全部楼层 来自 黑龙江哈尔滨

回复 11# feynmand 的帖子

文件都不是很大,基本500k左右,就是太多了!需要高效点的批处理。我查阅了以前论坛的帖子,真的还没有这个关于批处理的详细说明
回复 不支持

使用道具 举报

发表于 2008-11-13 16:55:52 | 显示全部楼层 来自 北京
原帖由 feynmand 于 2008-11-13 16:41 发表
你每个文件多大的,可以用txtread,一次不读取那么多进来。另外可以考虑使用Memory-Mapping,应该比直接load或者txtread什么的快一点,只是这个方面我也刚刚接触,不熟悉,你自己看看帮助文档吧。


你说的是textread吧?
不过按zhaobo_ren的要求,就算是500k的文件,20000个这样的数据量,如果直接导进来,内存能放得下吗?
还是应该读一个处理一个,最后拼成想要的形式

既然是量大,又想快捷,本身就很矛盾,的确是有挑战,欢迎大家讨论
回复 不支持

使用道具 举报

 楼主| 发表于 2008-11-13 17:13:20 | 显示全部楼层 来自 黑龙江哈尔滨
Num0=20          %文件排序起始个数%
   Num=267          %文件排序终了个数%   
  
for i=Num0:Num                                     %导入AAA.txt文件,文件由AAA0.txt开始
    eval(['load AAA',num2str(i),'.txt;'])     %eval将字符转化为窗口命令,num2str(i)将数字转化为字符
end

我就是这么做的,感觉速度很慢!其实这个还不是最主要的,最主要的是从这么多数据中提出我要的行元素,然后再拼到一起,这个最慢!也是由eval写的。起始就想让文件名编号实现循环即可!所以采用了num2str(i),而发现效率很低!
请教各位高手,要是实现这个文件名和参数名循环,除了eval之外,还有什么办法?
回复 不支持

使用道具 举报

发表于 2008-11-13 17:37:51 | 显示全部楼层 来自 新疆乌鲁木齐
eval的讨论早在以前bzzz兄的一些帖子里就曾经说过,循环执行时效率较低,zhaobo_ren兄这个问题感觉有如下三种途径可以改善:
1.将程序改写成C-MEX或者F-MEX,MEX在执行效率上与M程序有时大大改善,有时则无甚变化,甚至还慢。但就本问题而言估计写成MEX会好很多。
2.既然只是需要有格式数据文件中部分行的信息,那么可参照fgetl、fgets、textscan等命令逐行读取汇总为一个数据文件如mat等,把后处理部分最后进行。
3.完全改用fortran或VC++
回复 不支持

使用道具 举报

 楼主| 发表于 2008-11-13 19:19:35 | 显示全部楼层 来自 黑龙江哈尔滨

回复 15# bainhome 的帖子

没想到这个帖子能引起这么多,谢谢各位版主!
方法1,我试验了,或许是不好用,或许是我不会用,效果不好!
方法2,我感觉只能处理一个或几个文件,但是文件名里的数字循环我还没有参透该怎么做。
方法3,如果matlab不能实现高效处理,我想只要该用C或F了。
总之,十分感谢各位!
回复 不支持

使用道具 举报

发表于 2009-9-7 20:58:24 | 显示全部楼层 来自 北京
本帖最后由 tianben 于 2009-9-7 21:24 编辑

大虾们各显神通,认真学习了。
虽然导入的一堆变量名称是按照序数排列的,但是仍然不方便调用,比如将所有变量都转置然后输出,应该怎么有效的操作呢??
回复 不支持

使用道具 举报

发表于 2009-11-4 14:14:38 | 显示全部楼层 来自 日本
本帖最后由 messenger 于 2009-11-4 16:57 编辑

那假如每个数据表都有表头,也就是都有字符,直接不能读取,手动删太慢了吧。怎么处理啊?
每个数据表出来都有表头的吧。没有的话岂不是乱了。但是合并在一起的话,只需要一个表头,中间的怎么删除啊?
每个文件挺小的,合并在一起就可观了
名称应该不是问题吧,最简单的就是按照顺序排列,是选择循环还是别的什么方法高效?
回复 不支持

使用道具 举报

发表于 2009-11-4 16:59:27 | 显示全部楼层 来自 浙江杭州
本帖最后由 messenger 于 2009-11-7 14:58 编辑

17# liaohuanxin

什么样的数据?举一个例子出来

那假如每个数据表都有表头,也就是都有字符,直接不能读取,手动删太慢了吧。怎么处理啊?
每个数据表出来都有表头的吧。没有的话岂不是乱了。但是合并在一起的话,只需要一个表头,中间的怎么删除啊?
每个文件挺 ...
liaohuanxin 发表于 2009-11-4 14:14
回复 不支持

使用道具 举报

发表于 2009-11-7 14:46:20 | 显示全部楼层 来自 台湾
用 num2str:
for i = 1:2000
        s = ['AAA' num2str(i) '.txt'];
        load s
end
kokyo52 发表于 2008-11-13 15:40

小错误, 应该为load(s)
回复 不支持

使用道具 举报

发表于 2009-11-7 14:54:59 | 显示全部楼层 来自 台湾
"文件都不是很大,基本500k左右", 但究竟矩阵是多大, 200*200 ???
个人直觉LZ的问题在空间, 若同时有2000个200*200矩阵同时存在, 所需内存不小喔!
建议试试每load一笔即处理, 先删除不必存在矩阵後, 再读下一笔
或以同一矩阵名称读入workspace

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-7 03:24 , Processed in 0.090329 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表