非键盘字符处的Matlab strsplit

Matlab strsplit at non-keyboard characters

在这种情况下,我有一个 lat/long 坐标的元胞数组,我正在从文件中读取格式为字符串的字符串:

x = {'27° 57'' 21.4" N', '7° 34'' 11.1" W'}

其中°实际上是度数符号(U+00B0)。

我想使用 strsplit() 或类似的东西来取出数字部分,但我不知道如何将度数符号指定为分隔符。

我犹豫要不要简单地在 ',' 处拆分并索引数字,因为如上所示,我不知道需要多少位数。

我在网站的其他地方发现了以下建议:

x = regexp(split{1}, '\D+', 'split')

然而,这也将小数的整数和小数部分分开。

是否有 strsplit() 选项或我可以使用的其他等效选项?

您可以将数据文件中的度数符号复制粘贴到 M 文件脚本中。 MATLAB 在其字符串中完全支持 Unicode 字符。例如:

strsplit(str, {'°','"',''''})

在三个符号处拆分字符串。

或者,您可以使用 sscanf(如果直接从文件读取,则为 fscanf)来解析字符串:

str = '27° 57'' 21.4"';
dot( sscanf(str, '%f° %f'' %f"'), [1, 1/60, 1/3600] );

最简单的解决方案是按照 Cris 的建议将任何 Unicode 字符复制粘贴到您的 MATLAB 编辑器中

您可以轻松地从 Internet 或 Windows Character Map

获取这些内容

如果您想将字节值用于本机 Unicode 设置,也可以使用 unicode2nativenative2unicode

% Get the Unicode value for '°'
>> unicode2native('°')
ans = uint8(176)

% Check the symbol for a given Unicode value
>> native2unicode(176)
ans = '°'

所以

>> strsplit( 'Water freezes at 0°C', native2unicode(176) )
ans =
  1×2 cell array
  {'Water freezes at 0'}    {'C'}

如果你想避免 unicode2native:

,你可以通过在你已经知道的十六进制值上使用 hex2dec 来获得 Unicode 值
hex2dec('00B0') % = 176

您还可以改进正则表达式以捕获小数部分:

x = {'27° 57'' 21.4" N', '7° 34'' 11.1" W'}
x = regexp(x, '\d+\.?\d?', 'match') 
x{:}

结果:

ans =
{
  [1,1] = 27
  [1,2] = 57
  [1,3] = 21.4
}

ans =
{
  [1,1] = 7
  [1,2] = 34
  [1,3] = 11.1
}

其中 \d+\.?\d? 表示:

\d+  : one or more digit
%followed by
\.?  : zero or one point
%followed by
\d?  : zero or one digit

考虑对字符串使用 split 和 double:

>> x = {'27° 57'' 21.4" N'; '7° 34'' 11.1" W'};    
>> x = string(x)

x = 

  2×1 string array

    "27° 57' 21.4" N"
    "7° 34' 11.1" W"

>> x = split(x,["° " "' " '" '])

x = 

  2×4 string array

    "27"    "57"    "21.4"    "N"
    "7"     "34"    "11.1"    "W"

>> double(x(:,1:3))

ans =

   27.0000   57.0000   21.4000
    7.0000   34.0000   11.1000