对不起,我在这里使用文本扫描和格式真的很无望。我一直在尝试各种方式来获取正确的格式来从以下文本中提取时间,纬度和经度;
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);
它给了我空的双打,所以我做错了什么?
非常感谢你的帮助!!
答案 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]