【问题标题】:Reading a file into Matlab将文件读入 Matlab
【发布时间】:2012-03-16 01:18:12
【问题描述】:

我想将一个文件作为矩阵读入 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是case,第三个和第四个数字是经纬度坐标,另一个数字是年月日,另一个数字(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) 读取为字符串,以便稍后将其格式化为日期类型。

【问题讨论】:

    标签: matlab file-io


    【解决方案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() 的格式。

    【讨论】:

      【解决方案2】:

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

      尝试消除格式字符串中的空格并使用“空白”参数添加“\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()。

      希望这会有所帮助!

      【讨论】:

      • 感谢您的帮助,我们做到了!
      猜你喜欢
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 2015-09-26
      • 2013-06-22
      • 2015-01-30
      • 1970-01-01
      相关资源
      最近更新 更多