0

对不起,但我在这里使用 textscan 和格式真的很绝望。我一直在尝试各种获取正确格式的方法,以从以下文本中提取时间、纬度和经度;

    filename = 'A20020817_0610.20130725153026.L2.11479-3186.084800.0000.nc'

我想从上述文件名的第一部分提取时间: time: '20020817_0610' as (YYYYMMDD HH:MM)

然后得到纬度和经度;隆;'11479' 为 (114.79) 纬度;'-3186' 为 (-31.86)

到目前为止,我有以下格式,但它不起作用......??

   format_filename = '%*1n%8f%*1n%4f%*18n%5f%4f%*\n';
   read_filename = textscan(filename,format_filename);

它给了我空的双打,所以我做错了什么?

非常感谢你的帮助!!

4

2 回答 2

0

您的格式字符串中有一些错误。请参阅此链接以了解如何正确使用格式字符串。 http://www.mathworks.com/help/matlab/ref/textscan.html

filename = 'A20020817_1610.20130725153026.L2.11479-3186.084800.0000.nc';

format_filename = '%*1s %8d %*1s %4d %*19s %5d %*1s %4d %*[^\n]';
data = textscan(filename,format_filename);

data = 

[20020817]    [1610]    [11479]    [3186]

您必须将小数点 11479 和 3186 转换为所需的十进制值(不太难,只需除以 100)。我不认为 MATLAB 会自动采用十进制的字符串表示形式,例如 11479 并自动格式化它,因为您已将 %5.2f 放在格式字符串的相应位置。毕竟,格式字符串决定了 MATLAB 应该期望读取的值。

编辑:以下内容会将时间读取为字符串,并包括 Eitan 建议的纬度值符号。

format_filename = '%*1s %8d %*1s %4s %*19s %5d %5d %*[^\n]';
于 2013-11-24T20:29:42.177 回答
0

使用textscan

虽然textscan绝对可以在这里工作,但在尝试解析长字符串时可能会有些混乱:

res = textscan(filename, 'A%8s_%4s.%*[^.].L2.%5f%5f*[^\n]');
res = [res{:}]; %// Flatten array

经度和纬度值需要再进行一次操作:

res(3:4) = num2cell([res{3:4}] / 100);

使用正则表达式

标记字符串的另一种方法是使用正则表达式:

res = regexp(filename, '^A(\d+)_(\d+)\..*\.L2\.([^.]{5})([^.]{5})', 'tokens');
res = res{1};   %// Flatten array

完成后,您可以将经度和纬度字符串转换为数值:

res(3:4) = cellfun(@(x){str2num(x) / 100}, res(3:4));

有时后一种方法比使用textscan.

在任何情况下,输入字符串的结果都应该是以下元胞数组:

res = 
    '20020817'    '0610'    [114.7900]    [-31.8600]
于 2013-11-24T21:46:31.990 回答