2016-05-01 3 views
0

У меня есть большое количество CSV-файлов из моих экспериментов (200+), и ранее я их читал отдельно, а также для последующих шагов в обработке данных это утомительная работа.Возьмите строку из массива ячеек для имени переменной в рабочем пространстве matlab

co_15 = csvread('CO_15K.csv',5,0); 
co_25 = csvread('CO_25K.csv',5,0); 
co2_15 = csvread('CO2_15K.csv',5,0); 
co2_80 = csvread('CO2_80K.csv',5,0); 
h2o_15 = csvread('H2O_15K.csv',1,0); 
etc..... 

Так что я хочу, чтобы клетка в начале моего кода, глядя, как это и затем цикл, который просто читает их автоматически.

input = {'co_15' 5;'co_25' 5;... 
     'co2_15' 5; 'co2_80' 5;... 
     'h2o_15' 1; 'h2o_140' 1;... 
     'methanol_15' 5;'methanol_120' 5;'methanol_140' 5;... 
     'ethanol_15' 5;'ethanol_80' 1;'ethanol_140' 5;... 
     'co2_ethanol_15' 5 ;'co2_ethanol_80' 5;... 
     'h2o_ethanol_15' 1 ;'h2o_ethanol_140' 1;... 
     'methanol_ethanol_15' 5;'methanol_ethanol_120' 5;'methanol_ethanol_140' 5}; 

for n = 1:size(input,1) 
    input{n,1} = csvread(strcat(input{n,1},'k.csv'),input{n,2},0); 
end 

Клетка в этом коде составляет 19 строк и 2 столбцов, строк всех файлов и столбцов будут содержать параметры для обработки данных. Теперь проблема, с которой я не могу найти решение, заключается в том, что мой первый столбец является строковым именем, и я хочу, чтобы это имя строки являлось именем переменной, в которой csvread записывает свои данные, но так, как я ее настраивал, теперь она просто перезаписывает строка в первом столбце ячейки с данными csv. Чтобы быть более ясным, я хочу, чтобы в моем рабочем пространстве matlab были переменные с именами строк в первом столбце, содержащем данные моих файлов csv. Как я могу это решить?

ответ

2

Вы не Фактически хотите это сделать. Even the Mathworks will tell вы not to do this. Если вы пытаетесь использовать имена переменных для отслеживания соответствующих данных, то есть всегда - лучшая структура данных для хранения ваших данных.

Один из способов будет иметь массив ячеек

data = cell(size(input(:,1))); 
for n = 1:size(input,1) 
    data{n} = csvread(strcat(input{n,1},'k.csv'),input{n,2},0); 
end 

Еще один хороший вариант заключается в использовании struct. У вас может быть один struct с динамическими именами полей, которые соответствуют вашим данным.

data = struct(); 
for n = 1:size(input,1) 
    data.(input{n,1}) = csvread(strcat(input{n,1},'k.csv'),input{n,2},0); 
end 

Или на самом деле создать массив структур и удерживайте имя и данные внутри структуры.

for n = 1:size(input, 1) 
    data(n).name = input{n,1}; 
    data(n).data = csvread(strcat(input{n,1},'k.csv'),input{n,2},0); 
end 

Если вы Absolutly настаивают на этом (опять же, это очень много не рекомендуется), то вы можете сделать это с помощью eval:

for n = 1:size(input, 1) 
    data = csvread(strcat(input{n,1},'k.csv'),input{n,2},0); 
    eval([input{n, 1}, '= data;']); 
end 
+0

А если я на самом деле хочу, чтобы это сделать ? как бы вы это сделали с помощью функции eval, потому что я не могу заставить ее работать. Извините за то, что вы так stubbern, но я никогда не работал со структурой, и мне кажется, что мне нужно изменить все мои обработки данных после, а также, что у меня нет времени на данный момент – Terranees

+0

@Terranees Я обновил его с помощью решения. Опять же, если вообще возможно использовать один из первых трех подходов. – Suever

+0

Спасибо, я рассмотрю первые три подхода, когда у меня будет немного больше времени – Terranees

 Смежные вопросы

  • Нет связанных вопросов^_^