HITRAN 数据库是分子旋转-振动跃迁的列表。它以文本文件的形式给出,其中每行 160 个字符,具有定义分子、同位素等的固定宽度字段。格式有据可查,甚至在MathWorks 文件交换上还有一个程序可以读取数据库并模拟频谱的一部分。但是,我需要读取光谱的特定部分,然后用它对测量的光谱进行一些拟合,所以我需要更多定制的东西。
正如该函数的注释部分以及其他地方所给出的,以下行应正确读取每一行:
database = which('HITRAN2012.par');
fid = fopen(database);
hitran = textscan(fid,'%2u%1u%12f%10f%10f%5f%5f%10f%4f%8f%15c%15c%15c%15c%6c%12c%1c%7f%7f','delimiter','','whitespace','');
fclose(fid);
前两个字段表示从 1-47 运行的分子代码和从 1-9 运行的同位素代码。
不幸的是,分子 1-9 没有前导零,无论我做什么,它似乎都在默默地混淆 MATLAB。如果我加载整个数据库然后输入
unique(hitran{1})
我没有得到 1-47 的数字,但我得到了 10-92 缺少一些数字。据我所知,当 MATLAB 遇到前导空格时,它会将行移过来,然后填充末尾,这样“12”就变成了“12”,但我不确定。我也试过
hitran = textscan(fid,'%160c','delimiter','\n','whitespace','');
然后尝试解析生成的字符串,但这有时也会被第一个空格弄糊涂。
例如,第一条水线看起来像
exampleHitranLine = ' 14 0.007002 1.165E-32 2.071E-14.05870.305 818.00670.590.000000 0 0 0 0 0 0 7 5 2 7 5 3 005540 02227 5 2 0 90.0 90.0';
第一段代码遇到这一行并返回'14'
而不是' 1'
and '4'
。如果我只是读取一个仅包含分子 1 的子集(如本例中所示),那么第二种读取方法可以正常工作。但是,如果我尝试读取整个数据库,则分子 1-9 的行会向左移动,这会弄乱所有其他字段。
我应该注意,我尝试将数字字段读取为浮点数和整数,但都没有给出令人满意的结果。整个文本形式的数据库将近 700 MB,所以我需要一些尽可能高效的东西。
我究竟做错了什么?