我有一个包含数千行的文本文件,如下所示
20120601 000000603,1.234610,1.234780,0
其中前两个空格分隔列是日期和时间表示,后面三个逗号分隔列是数据。我想将文本文件读入八度矩阵,以便矩阵的列被分隔开。
2012 06 01 00 00 00 603 1.234610 1.234780 0
我确信我需要使用 textscan 函数,但我不知道按照我想要的方式分隔事物的格式字符串。
您可以使用功能
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");