在matlab中加载ASCII文件并将其保存为.mat

时间:2016-08-01 08:50:48

标签: matlab csv import

我有一个300MB的ascii文件,包含9列数据(制表符分隔,字符串和数字)。下面给出了一个示例行:

11204226 736539.402697000 192.168.0.104 10.0324 0 1.1313 3.543 3 9

文件结构良好,不存在空行或错误行。整个文件格式保持不变 当我尝试在Ubuntu 14.04中加载(importdata)文件时。 LTS,6GB RAM,Matlab 2015b系统刚冻结。我的同事成功地将文件加载到Windows 7,8GB RAM,Matlab 2014b中。

但是计划是将数据保存在.mat文件中,他也不能这样做。创建一个文件,但是大小增加到1GB以上,没有任何迹象表明它已经结束 我尝试通过图形界面或以下代码加载数据:

tdata = importdata('data.dat');

还通过图形界面尝试保存.mat文件。
我认为300MB的文件不应该构成这样的挑战。
您选择以哪种方式处理文件?
我希望.mat文件小于普通的ascii文件 此外,我的计划是避免将原始文件分成小块。

更新:
我的同事能够加载数据,将结构中的所有字符串条目转换为数字。这是前三列。除了由IP地址组成的第三列之外,我不确定为什么它们作为字符串导入。具有全数矩阵可以存储数据,并且得到的.mat文件大小为15MB。某种程度上,字符串和数字的混合搞砸了一切。还是不知道为什么。

1 个答案:

答案 0 :(得分: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是一个char数组。 那么保存所有这些数据呢? 我们可以将cell数组转换为double数组并删除ip列:

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

立即保存:

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

使用mat文件确实是个好主意,因为它现在由有用的数据类型组成,我们可以通过1次单击(或1行命令)加载它,并且它每次都比读取csv快得多。