将 CSV 导入 Matlab

Importing CSV into Matlab

某物的化学成分material

嗨,

我正在尝试在 matlab 中以 CSV 格式导入下面提到的数据,尺寸为 [1000x10]。

HCL;H2SO4;CH4;硫;氯;S2O3;SO2;NH3;CO2;O2 144 2 3 141 140 6 7 137 136 10 11 133

13 131 130 16 17 127 126 20 21 123 122 24

25 119 118 28 29 115 114 32 33 111 110 36

108 38 39 105 104 42 43 101 100 46 47 97

96 50 51 93 92 54 55 89 88 58 59 85

61 83 82 64 65 79 78 68 69 75 74 72

73 71 70 76 77 67 66 80 81 63 62 84

60 86 87 57 56 90 91 53 52 94 95 49

48 98 99 45 44 102 103 41 40 106 107 37

109 35 34 112 113 31 30 116 117 27 26 120

121 23 22 124 125 19 18 128 129 15 14 132

12 134 135 9 8 138 139 5 4 142 143 1

我可以通过我的代码导入这些数据

fid = fopen(uigetfile('.csv'),'rt');
FileName = fopen(fid);
headers = fgets(fid);    %get first line
headers = textscan(headers,'%s','delimiter',';'); %read first line
format = repmat('%f',1,size(headers{1,1},1)); %count columns n makeformat  string
data = textscan(fid,format,'delimiter',';'); %read rest of the file
data = [data{:}];

我在变量数据 [1000x10] 中获取矩阵形式的数据,并在名为 headers{1x1} 的元胞数组中获取所有组件的名称,例如 HCL、H2SO4。

现在我有两个问题,例如 matlab 中的内置导入功能,您可以灵活地将数据导入为单独的列向量、数字矩阵、元胞数组和 table 格式。是否可以通过代码这样做,比如我在导入后在我的工作区中获得名称为 [1000x1] 的 HCL 和名称为 [1000x1] 的 H2sO4 的列向量,等等所有名称为 [1000x1] 维度的列向量。 如果是,请帮助我...?

如果上面提到的不可能,那么我可以做另外一种选择,现在我在 headers 元胞数组中有列向量的名称,我如何提取这些名称并通过代码将这些名称用作列向量名称和我可以将数据矩阵 [1000x10] 中的数据分配给具有相应名称的每个列向量。

就像我说

x = headers {1*1}{1*1}; i will get x = "HCL" 
x = genvarname(x); I will get x= x0x22HCL0x2 BUT 
I want that x get replaced with HCL.and then I assign 
HCL = data(:,1) and same like this other variables H2SO4,SULPHUR, CHLORINE.
You can say i try to implement the import feature of column vector through     my code.

请帮我解决这个问题。谢谢

我知道这不是您要的,但我会转换为结构:

x=cell2struct(num2cell(data),headers,2)

原因很简单,无法选择例如带有单个变量的第三行。对于结构,只需使用 x(3)

如果在某些时候您需要您最初要求的向量而您不能使用 strcut,请使用 [x.HCL]

如果您愿意,可以使用这两种数据类型在 MatLab 中创建 table。我不是很熟悉它的使用,但它似乎有据可查。我相信其他人可以对此进行扩展。

编辑:

重新阅读你的问题后,我认为这更接近你所追求的。

n=10;
what='HCL';%change this to any of the strings you interested in
numstr = repmat('%f',1,n);
hdrstr = repmat('%s',1,n);

headers = textscan(headers,hdrstr,'delimiter',';');
headers = headers(1,:)
data = cell2mat(textscan(fid,numstr,'delimiter',';'));

datout = data(:,strcmp(headers,what));%datout will be 1000x1 HCL data

根据你想做什么,你可以适当地循环这些

你试过built-inreadtable功能吗?

您可以使用命名列 header 访问 table 的每一列。