如何使用matlab中的textscan从文件名中提取时间,lat,lon

时间:2013-11-24 13:54:06

标签: matlab format textscan

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

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

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

然后得到拉特和勒恩;      LON; '11479'为(114.79)      土地增值税; '-3186'为(-31.86)

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

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

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

非常感谢你的帮助!!

2 个答案:

答案 0 :(得分: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]';

答案 1 :(得分: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]