在 Octave 中读取文本文件并将其解析为矩阵

问题描述 投票:0回答:1

我有一个包含数千行的文本文件,如下所示

20120601 000000603,1.234610,1.234780,0

其中前两个空格分隔列是日期和时间表示,后面三个逗号分隔列是数据。我想将文本文件读入八度矩阵,以便矩阵的列被分隔开。

2012 06 01 00 00 00 603 1.234610 1.234780 0 

我确信我需要使用 textscan 函数,但我不知道按照我想要的方式分隔事物的格式字符串。

matrix ascii octave textscan
1个回答
0
投票

您可以使用功能

fscanf
(请参阅 文档中的格式化输入 在文档以及同一章中的其他一些后续页面中C-Style I/O Functions 有关格式的说明)将数据读入 矩阵,即将整数值转换为浮点值。

您通过示例描述的行格式可能是(次要解释 变化是可能的,例如最后一个条目是一位数长还是可以 它可以是任何小数):

"%4d%2d%2d %2d%2d%2d%3d,%f,%f,%d"

内容如下:

  • %4d
    - 四字符十进制整数,后跟
  • %2d
    - 两个字符的十进制整数,
  • %2d
    - 两个字符的十进制整数,
  • %2d
    - 两个字符的十进制整数,
  • %2d
    - 两个字符的十进制整数,
  • %2d
    - 两个字符的十进制整数,
  • %3d
    - 三个字符的十进制整数
  • ,
    逗号
  • %f
    - 浮点数(任意数量的字符),
  • ,
    - 逗号
  • %f
    - 浮点数(任意数量的字符),
  • ,
    - 逗号
  • %d
    - 十进制整数(任意数量的字符)

请注意,与逗号(和大多数其他字符)不同,字段之间的空格是 格式和匹配的输入文本都被忽略,因此可以使用

"%4d%2d%2d%2d%2d%2d%3d,%f,%f,%d"
(不含空格)格式,或
"%4d %2d %2d %2d %2d %2d %3d,%f,%f,%d"
为了更好的可读性

如果您有测试文件

input.txt
,其中包含以下内容:

20120601 000000603,1.234610,1.234780,0
20120602 010203604,2.234610,2.234780,11
20120603 000000605,3.234610,3.234780,22

使用

fileID = fopen('input.txt','r');
sizeM = [10, Inf];
M = fscanf(fileID, "%4d%2d%2d %2d%2d%2d%3d,%f,%f,%d", sizeM);
fclose(fileID);

(

[10, Inf]
表示结果矩阵将有 10 行和无限个 列数)将产生矩阵
M
:

   2.0120e+03   2.0120e+03   2.0120e+03
   6.0000e+00   6.0000e+00   6.0000e+00
   1.0000e+00   2.0000e+00   3.0000e+00
            0   1.0000e+00            0
            0   2.0000e+00            0
            0   3.0000e+00            0
   6.0300e+02   6.0400e+02   6.0500e+02
   1.2346e+00   2.2346e+00   3.2346e+00
   1.2348e+00   2.2348e+00   3.2348e+00
            0   1.1000e+01   2.2000e+01

其中每列包含对应行的 10 个值 输入文本,转换为浮点数并采用科学记数法(

2.0120e+03
表示
2012.0
)。当然,如果想保留矩阵,可以转置 连续输入行值。

函数

textscan
生成一个元胞数组,一种异构结构 尊重不同类型的输入 - 在本例中为整数和浮点数 点数字,但也可以是字符串。

格式应该是相同的,所以只需替换上面的

fscanf
行 与

M =textscan(fileID, "%4d%2d%2d %2d%2d%2d%3d,%f,%f,%d");
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.