匹配CSV数据集中的行

时间:2013-05-09 15:36:31

标签: matlab loops csv cell import-from-csv

在MATLAB中,我真的需要某人的专业知识。我有一个像以下一样的csv文件(额外的空格只是为了让它可读):

State,   Damage,    Blizzards,
Texas,   2,         2,
Alabama, 1,         0,
Alabama, 0,         1,
Texas,   5,         3,
Montana, 0,         8,
Arizona, 0,         0,
Arizona, 0,         1,
Texas,   8,         5,

我已经应用了textread和strcmpi。这是目标:我需要开发一个循环,使每个状态获得与状态相关的数据并将其绘制在一个图上,并为每个状态重复直到完成。所以对于循环一:Alabama有两个数据集,所以我需要这个提取和绘制。循环二:德克萨斯州有3个数据集,所以我需要这个提取和绘制。并且该过程重复进行,直到所有状态都已应用。

以下是代码:

filename = 'datacollect.csv'
[State,Damage,Blizzards] = ...
textread(filename,'%s %d... %d','delimiter',',','headerlines',1);
index1 = strcmpi(State, 'Texas');
Damage = Damage(index1)
Blizzards = Blizzards(index1)
plot(Damage,Blizzards) %for Texas

尝试将其设为循环,自动,因此我不必对其进行硬编码。

我真的需要一个解决方案 - 即使你不确定。

1 个答案:

答案 0 :(得分:2)

Amro's answer绝对应该指出你正确的方向,但是这里有完整的解决方案,如果你仍然遇到麻烦:

%// Parse CSV file
[States, Damage, Blizzards] = textread(csvfilename, '%s %d %d', ...
    'delimiter', ',', 'headerlines', 1);

%// Parse data and store in an array of structs
[U, ix, iu] = unique(States);        %// Find unique state names
S = struct('state', U);              %// Create a struct for each state
for k = 1:numel(U)
    idx = (iu == k);                 %// Indices of rows matching current state
    S(k).damage = Damage(idx);       %// Add damage information
    S(k).blizzards = Blizzards(idx); %// Add blizards information
end

生成的S是一个structs数组,其中包含statedamageblizzards字段。

现在,您可以循环遍历此结构数组,在每次迭代中访问相应结构的字段。例如,要访问Alabama(第二个结构)的damage值,您可以执行S(2).damage

希望这有帮助!