背景:PC-Axis 是一种用于传播统计信息的文件格式格式。许多国家统计机构使用该格式来发布官方统计数据。
PC-Axis 文件看起来有点像这样,尽管它们通常要长得多:
CHARSET=”ANSI”;
MATRIX="BE001";
SUBJECT-CODE="BE";
SUBJECT-AREA="Population";
TITLE="Population by region, time, marital status and sex.";
Data=
".." ".." ".." ".." ".."
".." ".." ".." ".." ".."
".." 24.80 34.20 52.00 23.00
".." 32.10 40.30 50.70 1.00
".." 31.60 35.00 49.10 2.30
41.20 43.00 50.80 60.10 0.00
50.90 52.00 53.90 65.90 0.00
28.90 31.80 39.60 51.00 0.00;
有关 PC-Axis 文件的更多详细信息,请参见瑞典统计局网站,但基本要点是元数据位于文件顶部,“DATA=”之后是实际数据本身。还值得注意的是,数据的组织方式更像数据表而不是列。
问题:我想用 Matlab 解析一个 PC-Axis 文件,但我对如何去做有点困惑。有谁知道如何在 Matlab 中解析这些文件之一?使用其他语言(如 Perl)解析这种类型的文件,然后将数据导入 Matlab 会更容易吗,或者,Matlab 是否适合这项工作?请注意,计划是在文本处理阶段之后在 Matlab 中分析数据。
我尝试过使用 Matlab 的文本处理工具,例如 fgetl、textscan、fscanf 和其他一些工具,但它非常棘手。有没有人对如何去做有任何指示?
本质上,我想将每个关键字(CHARSET、MATRIX 等)及其对应的值(ANSI、BE001 等)作为元数据存储在 Matlab 中——也许是一个结构。我也希望将数据存储在 Matlab 中 - 例如,作为矩阵。
注意:我知道 R 中的pxR 包 (CRAN),它可以将 .px 文件作为 data.frame 对象读入工作区。还有一个名为Data::PcAxis (CPAN)的 Perl 模块也非常好,但我特别想知道如何使用 Matlab 解析 .px 文件。
更新:我应该提到除了元数据和数据之外,还有变量。这最好用一个例子来解释。下面的示例 PC-Axis 文件与上面的相同,只是我添加了两个变量。它们被命名为 VALUES("Month") 和 VALUES("region") 并且位于元数据之后和数据之前。
CHARSET=”ANSI”;
MATRIX="BE001";
SUBJECT-CODE="BE";
SUBJECT-AREA="Population";
TITLE="Population by region, time, marital status and sex.";
VALUES("Month")="1976M01","1976M02","1976M03","1976M04",
"1976M05","1976M06","1976M07","1976M08",
"1976M09","1976M10","1976M11","1976M12";
VALUES("region")="Sweden","Germany","France",
"Ireland","Finland";
Data=
".." ".." ".." ".." ".."
".." ".." ".." ".." ".."
".." 24.80 34.20 52.00 23.00
".." 32.10 40.30 50.70 1.00
".." 31.60 35.00 49.10 2.30
41.20 43.00 50.80 60.10 0.00
50.90 52.00 53.90 65.90 0.00
28.90 31.80 39.60 51.00 0.00;
当将文本文件的每一行作为字符串(在单元格数组中)读取时,Textscan 会起到很好的作用。但是,两个变量(即 VALUES("Month") 和 VALUES("region"))的“=”符号后面的元素跨越多行。在这种情况下使用 textscan 似乎意味着必须连接一些字符串,例如,为了收集月份列表(1976M01 到 1976M12)。
问题:收集变量数据的最佳方法是什么?将文本文件作为单个字符串读取,然后使用 strtok 两次提取日期子字符串?也许,有更好(更系统)的方法?