0

我有很多 .csv 文件要读入 MATLAB,但在此过程中进行了一些整理

我的第一个问题是我的数据如下所示:

[...

file1  
ex1  
6;0  
8;0  
9;1  
file1  
ex2  
7;0  
8;1  
3;2  
file1  
ex3  
7;0  
8;1  
3;2  

由于某种原因,MATLAB 上的导入向导只获取第一个标题文本,然后是下面的数据集,并在到达下一个文本标题时丢弃所有内容。那么如何组织文件使其看起来像这样呢?

[...

file1......file1.....file1  
ex1.......ex2.......ex3  
6;0.......7;0.......7;0  
8;0.......8;1.......8;1  
9;1.......3;2.......3;2  

注意:不同前任的行数总是不同的,所以你不能只是将文件溢出到常规块中。

然后我的第二个问题是比较来自不同文件的相同实验。所以我想从所有不同的文件中取出“ex1”下面的列,然后在一个新的矩阵中水平排列。所以它看起来像这样:

file1.....file2.....file3.....    
ex1.......ex1.......ex1.......    
6;0.......6;0.......6;0.......  
8;0.......8;0.......8;0.......  
9;1.......9;1.......9;1....... 

注意:不同文件中的 ex 的顺序不同。我需要根据匹配标题行之一(例如,每当它被称为'track1')来匹配文件中的ex。


编辑:

这就是实际数据的样子。

4

2 回答 2

1

虽然我认识到这不是您问题的完整解决方案,但我经常用来克服文本编辑(以及您在 MATLAB 中解析时遇到的可怕速度损失)的替代解决方案是通过 MATLAB 连接器将您的数据加载到 Java 或 C# .

从 MATLAB 调用 C# 和 Java 相当容易,而且我做了很多我的文本工作。

于 2011-07-22T01:54:06.007 回答
1

由于每个 ex 中的行数不同,因此必须使用单元矩阵。

file = 'file1.csv';
h = 2; % # header lines
num_ex = 3;
r = h; % track the current row in the file
data = cell(1,num_ex);
for i=1:num_ex
    s = importdata(file, ';', r);
    x = s.data;
    data{i} = x;
    r = r + size(x,1) + h;
end

然后您可以使用大括号单元矩阵表示法访问您的数据

ex = 2;
x = data{ex};

所以你得到

x = [ 7  0
      8  1
      3  2 ]

对于第二个问题,您可以添加一个循环来遍历每个文件

filenames = {'file1.csv', 'file2.csv', 'file3.csv'};
h = 2; % # header lines
num_ex = 3;
r = h; % track the current row in the file
data = cell(1,num_ex);
for i=1:num_ex
    for f=1:length(filenames)
        file = filenames{f};
        s = importdata(file, ';', r);
        x = s.data;
        data{i} = [data{i} x];
    end
    r = r + size(x,1) + h;
end

这样data{1}就有了 ex 1 等的所有数据。

于 2011-07-21T18:15:07.983 回答