Чтение нескольких файлов .csv в Matlab при организации их в новые матрицы - PullRequest
0 голосов
/ 21 июля 2011

У меня есть много файлов .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').


EDIT:

Вот так выглядят фактические данные .

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Хотя я признаю, что это не полное решение вашей проблемы, альтернативное решение, которое я часто использую для преодоления редактирования текста (и ужасного снижения скорости, которое вы получаете при разборе в MATLAB), заключается в загрузке ваших данных через разъемы MATLAB для Java или C #.

Довольно просто вызывать C # и Java из MATLAB, и я делаю много текстовых вещей, которые были.

1 голос
/ 21 июля 2011

Поскольку число строк в каждом примере разное, необходимо использовать матрицу ячеек.

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} имеет все данные для примера 1 и т. Д.

...