项目笔记(一)

从周一一直做到昨天晚上十二点的任务需要记录一下。

我的任务笔记简单,就是处理最原始的数据。整体思路很简单,就是有10000行数据,每一行有101*101*4*15个数据。我需要每101*101*4个数据变成4个矩阵,然后找出4个矩阵对应位置的最大值,变为一个矩阵存成一个TXT。最终会得到150000个TXT文件。

整体思路其实很简单,但就是需要处理的数据量太大了,所以遇见了很多问题。

首先对原始数据进行初步处理。


一开始是一个字符串,然后一个浮点数标签,再之后才是主体数据。

所以一开始需要对字符串进行处理。

我使用的是eclipse。在使用eclipse的时候,我写了很多小项目,并且名字的区分度不高,而且项目的可复用性差,所以每次在使用的时候都需要改代码。因为有一些细小的地方没有改正而造成的错误有不少,浪费的时间也很多。

while((line = lnr.readLine())!= null) {
				int index = line.indexOf(",");
				int indexLast=line.lastIndexOf(",");			
				String label = line.substring(index + 1, indexLast);	
				frwLabel.write(label+"\r\n");//写入label
				String temp = line.substring(0, indexLast+1);				
				line = line.replace(temp, "");//去除train_
				frw.write(line + "\r\n");//写入处理好的数据
				
			}

我就在想怎么样处理数据,需要删除一开始的字符串,然后将标签提取到一个独立的文件中,之后将剩下的数字保存下来。

然后我发现了’,’。需要使用index函数。

点击打开链接

这个网站说的已经很清楚了。在一开始使用的时候对函数的概念还比较模糊,以为index是会返回所有位置。再次明确一下。indexOf返回的是子字符串出现的第一个位置,lastIndexOf返回的是子字符串出现的最后一个位置。

首先先将label截取出来。因为如果先删除字符串的时候,同时也要删除‘,’比较简单,否则需要删除两次,数据量一大,所需要的时间超级多啊啊啊。

对于substring这个函数来说,最重要的是里面的参数,之前使用过很多次,但总是不注意,只要最后的结果对了就行。这次需要明确一下。

如果只有一个参数,代表从0位置开始截取,截取到参数之前的最后一个字符,并不包含参数位置的字符,一定要注意。返回值是截取之后剩下的字符!!!!!!!!

如果有两个参数,代表从第一个参数的位置开始截取,截取到第二个参数之前的位置,一定要注意,不会截取到第二个参数所在的位置,返回值是截取下来的参数!!!!!!!!!

trim()用于去掉字符串左右两边的空格,可以在调整格式的时候使用。

在这里就是因为参数不清晰,不断的来回改浪费了一点时间。

之后得到了10000行的大文件。一开始就直接放在了matlab中跑程序,结果第二天早上一看,文件连读都没读进来。所以将原来的文件切分成了1000份。每一份有10行。

			int MAX = 10000,unit_length = 10;
			for(int i = 0;i < MAX/unit_length;i++) {
				File fileW = new File("E:\\environmentProject\\needed\\data"+i+".txt");
				FileWriter frw;
				frw = new FileWriter(fileW);
				int line_num = 0;//设定每一个样本的行数为10
				while((line = lnr.readLine())!= null && line_num < unit_length) {
					line_num++;
					frw.write(line + "\r\n");//写入处理好的数据
				}
				frw.close();
			}

之后进行matlab编程。就在想,怎么能在4个矩阵中取得最大值,并且速度最快呢。所以首先循环1000(文件个数)次,然后循环10(文件中的行数)次,再循环15次。这样每次在最内层循环中只需要处理101*101*4个数据,就是4个矩阵。怎样得到最大位置的最大值。一开始的思路就是用一个3维数组存储数据,然后做比较得出结果。但是在编码的时候,发现可以先定义一个101*101的result二维矩阵。因为最小值为0,所以将result初始化为0.之后进行4次循环。每一次在循环的过程中,将result的对应位置和当前矩阵元素进行比较,存储最大值。

for file_num = 909
    textName = ['data' num2str(file_num) '.txt'];
    input = load(textName);
    Data = input(1:sum,:);
    for s = 1:sum
        fprintf('start loop.%d          %d\n',file_num,s);
        for t = 1:time
            index = 1;
            textName = ['result' num2str((file_num)*sum*time + (s - 1) * time + t) '.txt'];
               result = zeros(row, colume);
               for l = 1:layer
                   for c = 1:colume   %按列检索
                       for r = 1:row
                            result(r,c) = max(result(r, c), Data(s,index));
                            index = index + 1;
                        end
                    end
                end
                dlmwrite(textName, result);
        end
    end

代码应该没问题吧吐舌头

关键是还在等师兄的验证,心里焦躁啊

里面有几点需要记住。

首先。加载TXT文件直接用load就好。

点击打开链接

但是有一个问题就是网上说,load加载的是工作空间下的mat文件,这我知道,但是我加载的是TXT文件是可以的。的确是需要在当前路径下,否则的确是无法读取的。并且对于文件名中含有数字来说,我找到的是一个简单的类似于填写矩阵元素的拼接,并不像其他语言直接调用函数或者是用+进行连接。只要写在一个矩阵中就可以了。

在网上查了一下,因为是纯数字,所以load没有问题。如果里面有字符串,可以使用file目录下的导入,但是中文会有乱码。

或者使用textread函数,但是太麻烦。如果这种情况,我宁可使用Java或者其他语言。

百度经验里面有一个importdata方法,挺好用的,但是有一个问题就是每一行的数据不能太多,会超限。这个函数的好处就是将有规律的字符串和数字分开



如果处理小规模的数据还是不错的,就不用想办法摘除字符串了。

之后就是将矩阵存入TXT文档中。当时在这里花费的力气是最大的,一直找不到合适的函数。最后的函数其实也不是很喜欢。因为数据和数据之间是用逗号隔开的,还得将这150000个TXT去逗号,是一个不小的工程,并且在实际使用中出错了,部分文件存储的矩阵不全,还得不断为文件验证是否有问题,其实挺麻烦的。网上最多的方法就是一行行遍历,但在数据量偏大的时候,效率啊啊啊啊啊。

对了,网上有这种方法:点击打开链接亲测,不好使啊啊。

然后,我发现了最好用的还是dlmwrite函数啊, dlmwrite('data.txt',data,'\t')代表使用tab建隔开就好了嘛,根本不需要再转换文件。说到这里,我想去哭一下。那我之前做的这么多工作是为了啥。还因为读写冲突出了好多错,啊啊啊啊啊啊啊啊。

fopen和fprint,我觉得吧,不用就不用了。

然后每隔14个文件,将第15个文件,复制,并且改名。我用Java文件写的,找了半天,只找到一个改名的,但我想保留原文件啊,只能用各种低级算法,各种浪费时间。。。

然后知道matlab中有一个神奇的函数叫做copyfile。。。。。。。。。。。。。

所以我又浪费了大量的时间,难不成就只是为了学这个函数,excuse me!!!

所以,这样就很开心的结束了呢。

如果下次再有类似工作,打死我都不会再用这么长时间了。。。。





















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章