将文件读入Matlab

时间:2012-03-16 01:18:13

标签: matlab file-io

我想将一个文件读入Matlab,作为包含奇数格式信息的文件的矩阵。

文件data.txt的数据写为:

04001400 HI 34.50 118.27 19480701 08 LST
         0   0   0   0   0   0   0   0   0   0   0   0
       MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480801 08 LST
         0   0   0   0   0   0   0   0   0   0   0   0
       MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
04001400 HI 34.50 118.27 19480901 08 LST
         0   0   0   0   0   0   0   0   0   0   0   0
       MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS

第一个数字是站号,HI是一个案例,第三个和第四个数字是纬度和长坐标,另一个数字是年,月,日,而另一个数字(08)是时区,其次是由LST意味着时间框架。以下24个数字或上例中的0和MIS是特定区域和时间的值。我试图将文件的内容存储为这种维度[n x 31]格式的矩阵(其中31是列数,n是文件中的总行数):

04001400 HI 34.50 118.27 19480701 08 LST 0   0   0   0   0   0   0   0   0   0   0   0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS

04001400 HI 34.50 118.27 19480801 08 LST 0   0   0   0   0   0   0   0   0   0   0   0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS

04001400 HI 34.50 118.27 19480901 08 LST 0   0   0   0   0   0   0   0   0   0   0   0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS

我尝试过基于函数textscan()的编码方式:

fid = fopen('data.txt', 'rt');
data = textscan(fid, '%d %s %f %f %s %d %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s');
fclose(fid);

但它不像我上面所描述的那样有用。有没有办法可以做到这一点?谢谢你的帮助。

注意:我想将日期(19480701)读作字符串,以便稍后将其格式化为日期类型。

2 个答案:

答案 0 :(得分:1)

您的示例代码不起作用,因为textscan()假定文件中的每一行都具有相同的格式。也就是说,要使用textscan(),每行必须具有相同数量的列,包含相同类型的数据。

我会将数据视为逗号分隔值格式。将每一行拆分为由空格分隔符like suggested by Rob Henson here

分隔的标记列表
>> string = 'Need-to-split-this-string'

string =

Need-to-split-this-string

>> parts = strread(string,'%s','delimiter','-')
parts =

    'Need'
    'to'
    'split'
    'this'
    'string'

您需要循环读取所有行的文件。您的数据似乎有三行的节,因此一次处理三行数据。


或者,您可以对文本文件执行预处理运行,以将三行的每个节重新格式化为一行。 (只需删除每三个换行符中的第一个和第二个。)然后使用正则表达式用逗号替换空格。你最终会得到类似的东西:

04001400,HI,34.50,118.27,19480701,08,LST,0,0,0,0,0,0,0,0,0,0,0,0,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS
04001400,HI,34.50,118.27,19480801,08,LST,0,0,0,0,0,0,0,0,0,0,0,0,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS
04001400,HI,34.50,118.27,19480901,08,LST,0,0,0,0,0,0,0,0,0,0,0,0,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS,MIS

然后采用的格式为textscan()或更好,csvread()

答案 1 :(得分:0)

实际上,您编写的代码应该非常接近工作。你只需要告诉textscan()将换行符视为普通的空白字符。

尝试删除格式字符串中的空格,并使用'whitespace'参数添加'\ n':

data=textscan(fid, '%d%s%f%f%s%d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s','whitespace',' \b\t\n';

另外,请务必仔细检查输入文件是否以任何空行结束。这似乎搞乱了textscan()。

希望这有帮助!