我希望在不保存文件的情况下从.dat文件中读取一些数据。为了做到这一点,我的代码如下所示:
urlsearch= 'http://minorplanetcenter.net/db_search/show_object?utf8=&object_id=2005+PM';
url= 'http://minorplanetcenter.net/tmp/2005_PM.dat';
urlmidstep=urlread(urlsearch);
urldata=urlread(url);
received= textscan(urldata , '%5s %7s %1s %1s %1s %17s %12s %12s %9s %6s %6s %3s ' ,'delimiter', '', 'whitespace', '');
data_received = received{:}urlmidstep的功能只是做一个“搜索”,以便能够创建临时的.dat文件。这些数据被存储在urldata中,这是一个很长的字符数组。当我在MATLAB中使用textscan时,我得到了想要的12列,它们被存储在一个单元格数组data_received中。
然而,在Octave中,我得到了各种警告消息:warning: strread: field width '%5s' (fmt spec # 1) extends beyond actual word limit (对于不同的字段宽度)。我的问题是,为什么我的结果在Octave中不同,我如何解决这个问题?Octave的行为是否应该与MATLAB相同,因为在理论上,任何差异都应该作为bug来处理?
当然,指定字符串的宽度,并将分隔符和空格输入参数都留空,应该会告诉函数只处理字符串的宽度,允许空格成为有效字符。
任何帮助都将不胜感激。
发布于 2015-07-14 20:11:22
我认为textscan在MATLAB和Octave中的工作方式不同。为了说明这一点,让我们简化这个示例。代码:
test_line = 'K05P00M C2003 01 28.38344309 37 57.87 +11 05 14.9 n~1HzV645';
test = textscan(test_line,'%5s','delimiter','');
test{:}在MATLAB中,will将产生以下结果:
>> test{:}
ans =
'K05P0'
'0M C'
'2003 '
'01 28'
'.3834'
'4309 '
'37 57'
'.87 +'
'11 05'
'14.9 '
'n~1Hz'
'V645'而在Octave中,你会得到:
>> test{:}
ans =
{
[1,1] = K05P0
[2,1] = C2003
[3,1] = 01
[4,1] = 28.38
[5,1] = 37
[6,1] = 57.87
[7,1] = +11
[8,1] = 05
[9,1] = 14.9
[10,1] = n~1Hz
}因此,Octave看起来像是跳到下一个单词,并丢弃当前单词中的任何剩余字符,而MATLAB将整个字符串视为一个连续的单词。
为什么是这样,哪一个是正确的,我不知道,但希望它能为您指明正确的方向,以了解正在发生的事情。您可以尝试添加delimiter,看看它对结果有何影响。
https://stackoverflow.com/questions/31402680
复制相似问题