非键盘字符处的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 设置,也可以使用 unicode2native
和 native2unicode
。
% 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
在这种情况下,我有一个 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 设置,也可以使用 unicode2native
和 native2unicode
。
% 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