1

我正在尝试加载以下数据集

阿富汗,5,1,648,16,10,2,0,3,5,1,1,0,1,1,1,0,green,0,0,0,0,1,0,0,1, 0,0,黑色,绿色

阿尔巴尼亚,3,1,29,3,6,6,0,0,3,1,0,0,1,0,1,0,red,0,0,0,0,1,0,0, 0,1,0,红色,红色

阿尔及利亚,4,1,2388,20,8,2,2,0,3,1,1,0,0,1,0,0,green,0,0,0,0,1,1,0, 0,0,0,绿色,白色

...

问题是它同时包含整数和字符串。我发现了一些关于如何只取出整数的信息。但是一直无法查看是否有任何方法可以获取所有数据。

我的问题是这可能吗?

如果那是不可能的,那么有没有办法找到每一行上的数字并将其他所有东西都扔掉而不必选择列?

我特别需要,因为我似乎不能str2num一次在整条线上使用。

4

1 回答 1

6

几乎一切皆有可能,您只需准确定义目标即可。

假设您的数据库存储为文本文件,您可以使用 逐行解析它textread,然后应用regexp仅过滤数字字段(这不需要有关列的先验知识):

C = textread('database.txt', '%s', 'delimiter', '\n');
C = cellfun(@(x)regexp(x, '\d+', 'match'), C, 'Uniform', false);

这里的结果是一个由字符串元胞数组组成的元胞数组,其中每个字符串对应于特定行中的一个数字字段。

由于数字仍然存储为字符串,您可能需要将它们转换为实际数值。有很多方法可以做到这一点,但您可以str2num以一种棘手的方式使用:它可以将分隔的字符串转换为数字数组。这意味着,如果将特定行中的所有字符串连接回一个字符串,并在其间放置空格,则可以str2num一次应用所有字符串,如下所示:

C = cellfun(@(x)str2num(sprintf('%s ', x{:})), C, 'Uniform', false);

结果C是一个向量元胞数组,每个向量包含对应行中所有数值字段的值。要访问特定向量,您可以使用花括号 ( {})。例如,要访问第二行的数字,您可以使用C{2}.

当然,在解析过程中会丢弃所有非数字字段。如果你也想保留它们,你应该使用不同的正则表达式regexp

祝你好运!

于 2013-01-13T11:57:45.827 回答