2016-08-01 105 views
0

我有一個300MB的ascii文件,包含9列數據(製表符分隔,字符串和數字)。一個例子線下面給出:在matlab中加載ASCII文件並將它們保存爲.mat

11204226 736539.402697000 192.168.0.104 10.0324 0 1.1313 3.543 3 9

該文件結構良好,沒有空行或有故障的行應該存在。該格式在整個文件中保持不變。
當我嘗試加載(importdata)Ubuntu 14.04中的文件。 LTS,6GB RAM,Matlab 2015b系統只是凍結。我的同事成功地將文件加載到Windows 7,8GB RAM,Matlab 2014b中。

但是,該計劃是將數據保存在.mat文件中,他也無法做到這一點。文件被創建,但大小增加到1GB以上,沒有任何結束的跡象。
我試圖經由所述圖形界面或以下代碼加載數據:

tdata = importdata('data.dat'); 

保存.MAT文件經由接口grapical試圖爲好。
我認爲一個300MB的文件不應該構成這樣的挑戰。
你會選擇哪種方式處理文件?
我希望.mat文件比普通的ascii文件小。
此外,我的計劃是避免將原始文件分成小塊。

更新:
我的同事誰能夠加載數據,將結構中的所有字符串條目轉換爲數字。這是前三列。除了包含IP地址的第三列之外,我不確定爲什麼它們作爲字符串導入。使用全數字矩陣可以存儲數據,生成的.mat文件大小爲15MB。不知何故,字符串和數字的組合搞砸了一切。仍然不知道爲什麼。

+2

好吧,文件大小不應該是一個問題 - 我已經加載了超過10GB的文件,即使RAM不適合它 - Matlab會緩存它反正。我假設的問題可能是你的代碼 - 所以請編輯你的問題並把它提出來。 – GameOfThrows

+2

大多數'自動'導入程序會在第3列(IP地址,用3'.'分隔的4個數字,它不符合任何'數字'標準)時掙扎或窒息。我建議使用['textscan'](http://mathworks.com/help/matlab/ref/textscan.html)在您的數據具有不同類型的字段/列時導入數據。 – Hoki

回答

0

我在我上一個項目中打開了大的csv文件(大約700MB)。首先我使用xlsread,但發現它的一些限制(我無法打開包含超過100萬行的文件,並且此功能需要大量時間)。所以我發現很有用textscan函數。這裏類似於您的示例數據樣本的例子:

我的CSV例如:

11204226 736539.402697001 192.168.0.101 10.0321 1 1.1311 3.543 3 9 
11204333 736539.402697002 192.168.0.102 10.0322 2 1.1312 3.543 3 9 
11204444 736539.402697003 192.168.0.103 10.0323 3 1.1313 3.543 3 9 

我的代碼:

fileID = fopen('newfile.csv','r'); 

formatSpec1 = '%f%f%f%f%f%f%f%f%f%f%f'; 
A = textscan(fileID, formatSpec1,'Delimiter',{';'}); 

結果:A是一個單元陣列。 A的每個單元格包含整列數據。 我們可以爲IP地址做些什麼? 我例如建議這種方式:

myip = strcat(num2str(A{3}),'.',num2str(A{4}),'.',num2str(A{5})) 

myip = 

192.168.0.0.101 
192.168.0.0.102 
192.168.0.0.103 

myip是字符數組。 保存所有這些數據呢? 我們能電池陣列轉換爲雙陣列和刪除IP列:

res = cell2mat(A); 
res(:,3:5) = []; 

立即保存:

save('test.mat','res','myip') 

使用墊文件確實是個好主意,因爲它現在包含有用的數據類型,我們可以加載它通過1次點擊(或1行命令),並且比每次讀取csv要快得多。

+0

非常感謝您的方法!我能夠成功加載數據並將其保存在.mat文件中。 – Green

相關問題