将文件读入Matlab

将文件读入Matlab,matlab,file-io,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

我想将一个文件读入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是文件中的总行数):

我尝试过基于函数textscan()以这种方式对其进行编码:

但它并不像我上面描述的那样有效。我有办法做到吗?谢谢你的帮助


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

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

相反,我会将数据视为逗号分隔的值格式。将每行拆分为由空格分隔符分隔的标记列表:

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


或者,您也可以对文本文件进行预处理,将三行的每一节重新格式化为一行。(只需删除每三行换行中的第一行和第二行)然后使用正则表达式将空格替换为逗号。您将得到以下结果:

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()

实际上,您编写的代码应该非常接近工作状态。您只需告诉TestSCAN()将新行字符也视为一个普通的空白字符。

尝试删除格式字符串中的空白,并使用“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()搞砸了


希望这有帮助

谢谢你的帮助,这次成功了!
>> 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
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';