【问题标题】:MATLAB : Alphanumeric character string extractionMATLAB:字母数字字符串提取
【发布时间】:2014-11-22 14:06:31
【问题描述】:

作为前言,我一直在寻找解决方案,我尝试了无数代码,但没有一个适用于特定情况。

我有一个变量,即不同英国公司的注册号。数据最初来自Stata,我不得不使用代码将非数字数据导入Matlab。这个变量 (regno) 是数值,直到观测值 18000(大约)。从那时起,它就变成了包含字母和数字的注册号。

我写了一个非常粗略的循环,抓取初始变量(单元格),取出双引号,并将字符提取到另一个矩阵(双精度)中。代码是:

regno2 = strrep(regno,'"','');
regno3 = cell2mat(regno2);
regno4 = [];
    for i = 1:size(regno3,1);
    regno4(i,1) = str2double(regno3(i,1:8));
    end

对于同时包含字母和数字的变量,我得到 NaN。我需要将变量作为双精度变量,以便在 MatLab 中将它们用作虚拟指标变量。有什么想法吗?

谢谢

【问题讨论】:

  • 您能举一个小例子来说明 regno 通常的样子吗?上面的解释我没看懂抱歉。
  • 对不起,让我解释一下。原始 regno 变量具有以下组件: '"04352558"' '"04375023"' '"04406319"' '"NI000166"' '"NI000166"' '"NI000166"' 我只是抓住了一些观察结果来显示这两种类型案例(数字和字母数字)。我设法将第一种类型的观察结果加倍,但对于第二种类型的观察却无法做到(我得到 NaN)
  • 好的,谢谢。因此,对于示例“NI000166”,您只想恢复数字 000166 对吗?
  • 最好我需要恢复所有这些,包括信件。但是由于变量本身除了作为指标之外没有任何经济用途,我不确定仅提取数字是否会产生任何影响。唯一的问题是,如果其中一个数字观测值(例如,“00001234”)与字母数字观测值(即“SC001234”)具有相同的数字。那么指示变量会将两个观测值视为相等,这可能会造成问题。

标签: matlab char type-conversion


【解决方案1】:

好吧,我不完全确定您是否一直需要字母,但这里 regular expressions 可能会执行您想要的操作。

这是一个帮助您入门的简单示例;在这种情况下,我使用正则表达式来查找您的条目中的数字。

clear

%// Create dummy entries
Case1 = 'NI000166';
Case2 = '12ABC345';

%// Put them in a cell array, like what you have.
CasesCell = {Case1;Case2};

%// Use regexp to locate the numbers in the expression. This will give the indices of the numbers, i.e. their position within each entry. Note that regexp can operate on cell arrays, which is useful to us here.
NumberIndices = regexp(CasesCell,'\d');

%// Here we use cellfun to fetch the actual values in each entry, based on the indices calculated above.
NumbersCell = cellfun(@(x,y) x(y),CasesCell,NumberIndices,'uni',0)

现在 NumbersCell 看起来像这样:

NumbersCell = 

    '000166'
    '12345'

您可以使用 str2num(或 srt2double)将其转换为数字,一切顺利。

请注意,如果您有 00001234 或 SC001234,则 regexp 给出的值将被视为不同,因此不会导致问题。如果变量的长度不同,并且您有相似的数字,那么您需要使用正则表达式添加一些代码来考虑字母。 希望有帮助!如果您需要澄清或我误解了什么,请告诉我!

【讨论】:

  • 它确实奏效了!现在我只需要确保我没有得到虚拟变量的重叠值。谢谢!
  • 很高兴能提供帮助!
猜你喜欢
  • 2017-07-30
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多