項目筆記(一)

從週一一直做到昨天晚上十二點的任務需要記錄一下。

我的任務筆記簡單,就是處理最原始的數據。整體思路很簡單,就是有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!!!

所以,這樣就很開心的結束了呢。

如果下次再有類似工作,打死我都不會再用這麼長時間了。。。。





















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