我有一个csv文件,它包含2列4列数组,但行数不等。例如:Matlab从csv文件中读取多个二维数组
2, 354, 23, 101
3, 1023, 43, 454
1, 5463, 45, 7657
4, 543, 543, 654
3, 56, 7654, 344
...
我需要能够导入数据,这样我可以每个数据块上运行业务,但是csvread,dlmread和textscan都不理的空行。
我似乎无法在任何地方找到解决方案,如何做到这一点?
PS:
这可能是值得指出的是,上述格式的文件实际上是包含只有一个数据块(许多文件拼接我不希望有从数以千计的阅读文件每次),因此块之间的空白行可以更改为任何其他分隔符/标记。这只是用python脚本完成的。
编辑:我的解决方案 - 基于/启发的Petrichor下面
我更换了csvread与textscan这是更快。然后我意识到,如果我用nan行代替空白行(修改我的python脚本),我可以删除第二个慢点文本扫描。我的代码是:
filename = 'data.csv';
fid = fopen(filename);
allData = cell2mat(textscan(fid,'%f %f %f %f','delimiter',','));
fclose(fid);
nanLines = find(isnan(allData(:,1)))';
iEnd = (nanLines - (1:length(nanLines)));
iStart = [1 (nanLines(1:end-1) - (0:length(nanLines)-2))];
nRows = iEnd - iStart + 1;
allData(nanLines,:)=[];
data = mat2cell(allData, nRows);
其中0.28s(一个只有103000行文件)计算。我已经接受了petrichor的解决方案,因为它最能解决我最初的问题。
+0
我想一个办法是更换空行用类似的NaN,NaN的不同,NaN,NaN的,然后使用csvread加载数据后,或者类似的东西,你可以循环访问数据,并且很容易地在matlab中提取块。 –
+0
我希望避免在导入之后通过数据循环(我假设),这只会为整个过程增加更多时间。另一方面,我发现迄今为止,textscan是最快的导入方式? –
+0
如何不留下任何分隔线,而是创建第二个文件,该文件只是新块开始时的行索引,然后使用此文件来定义要处理的行范围,而不是为每个块创建单独的矩阵? –