在matlab中加载ASCII文件并将它们保存为.mat
我有一个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。不知何故,字符串和数字的组合搞砸了一切。仍然不知道为什么。
我在我上一个项目中打开了大的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要快得多。
非常感谢您的方法!我能够成功加载数据并将其保存在.mat文件中。 – Green
好吧,文件大小不应该是一个问题 - 我已经加载了超过10GB的文件,即使RAM不适合它 - Matlab会缓存它反正。我假设的问题可能是你的代码 - 所以请编辑你的问题并把它提出来。 – GameOfThrows
大多数'自动'导入程序会在第3列(IP地址,用3'.'分隔的4个数字,它不符合任何'数字'标准)时挣扎或窒息。我建议使用['textscan'](http://mathworks.com/help/matlab/ref/textscan.html)在您的数据具有不同类型的字段/列时导入数据。 – Hoki