将多个.csv文件读入Matlab,同时将其组织成新矩阵

将多个.csv文件读入Matlab,同时将其组织成新矩阵,matlab,csv,file-io,import-from-csv,Matlab,Csv,File Io,Import From Csv,我有很多.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 file1.....file2.....file3..... ex1.......ex1.......ex1....... 6;0.......6;0.......6;

我有很多.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  
file1.....file2.....file3.....    
ex1.......ex1.......ex1.......    
6;0.......6;0.......6;0.......  
8;0.......8;0.......8;0.......  
9;1.......9;1.......9;1....... 
出于某种原因,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  
注意:不同ex的行数总是不同的,所以不能将文件分成常规块

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

[...

file1  
ex1  
6;0  
8;0  
9;1  
file1  
ex2  
7;0  
8;1  
3;2  
file1  
ex3  
7;0  
8;1  
3;2  
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顺序不同。我需要根据匹配头的一行来匹配文件中的ex(例如,每当它被称为“track1”时)


编辑:
这是的外观。

由于每个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}
拥有ex1的所有数据,等等。

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


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

确切地说,这些不是逗号分隔的文件,而是自定义格式的文本文件…我收到的扩展名是.csv,但是,当在excel或写字板中打开时,它们会自动拆分为一个长列。你能上传一个只有几行的文件示例吗?分号是什么意思?数值matlab矩阵中不能有分号。分号用于分割数值数据的x轴和y轴。如果可以同时拆分它们,那就好了。您当前的代码如何跳过前两行标题?我的理解是file1.csv中的第一行实际上是“file1”.
dlmread
的第三个参数告诉我要跳过多少头行(行)。嗯,我不知道问题出在哪里,但当我尝试您的解决方案时,我得到了“?”使用==>dlmread在145处文件和格式字符串不匹配时出错。从文件读取数字时出现问题(第4行,字段1)==>file1\n“您好。我尝试了该脚本,但收到一条错误消息:???在文件和格式字符串之间的145处使用==>dlmread时出错。从文件读取数字时出现问题(第88行,字段1)==>agmm\n中的错误==>readfiles at 7 x=dlmread(文件“;”,r,0);在这种情况下,“agmm”是第一个头(总共有4行)在再次重复“agmm”之前有87行数字数据(这是参与者代码)啊,我看到Jonas发现了同样的问题。就像使用导入向导时,Matlab不喜欢重复的标题一样。