textscan

从文本文件或字符串中读取格式化数据

描述

C= textscan (文件标识formatSpec从打开的文本文件中读取数据到单元格数组中,C。文本文件由文件标识符表示,文件标识。采用FOPEN以打开该文件并获取文件标识值。当您完成从文件中读取,通过调用关闭文件文件关闭(文件标识)

textscan试图将文件中的数据与转换说明符中的数据匹配formatSpec。该textscan函数重新申请formatSpec遍历整个文件,当无法匹配时停止formatSpec的数据。

C= textscan (文件标识formatSpecñ通过读取文件数据formatSpecñ次,ñ是一个正整数。后从文件中读取的附加数据ñ周期,通话textscan再次使用原文文件标识。如果通过调用恢复文件的文本扫描textscan具有相同的文件标识符(文件标识),然后textscan自动恢复读取到它终止最后一次读取的地方。

C= textscan (CHRformatSpec从字符向量中读取文本CHR入单元阵列C。当从一个特征向量阅读文本,重复来电textscan每次都从头开始重新启动扫描。要从最后一个位置重新开始扫描,请求a位置输出。

textscan尝试匹配字符向量中的数据CHR中指定的格式formatSpec

C= textscan (CHRformatSpecñ使用formatSpecñ次,ñ是一个正整数。

C= textscan (___名称,值使用一个或多个指定的选择名称,值除了前面语法中的任何输入参数之外,还要对参数进行配对。

[C位置] = textscan(___返回文件或在扫描作为第二输出参数的端部的特征向量中的位置。对于文件,这是值ftell(文件标识)在调用后返回textscan。对于一个字符向量,位置表明有多少个字符textscan读。

例子

全部折叠

读取包含浮点数的字符向量。

CHR ='0.41 8.24 3.57 6.24 9.27';C = textscan(CHR,' % f ');

这说明符' % f 'formatSpec告诉textscan来匹配每个字段CHR到双精度浮点数。

显示单元格数组的内容C

celldisp(C)
13 C {1} = 0.4100 8.2400 3.5700 6.2400 9.2700

读取相同的字符向量,并将每个值截断为一个十进制数字。

C = textscan(CHR,' % 3.1 f % * 1 d ');

这说明符% 3.1度表示字段宽度为3位数字,精度为1。该textscan函数总共读取3位数字,包括小数点和小数点后的1位。说明符,% * 1 d告诉textscan跳过剩下的数字。

显示单元格数组的内容C

celldisp(C)
C{1} = 0.4000 8.2000 3.5000 6.2000 9.2000

数据文件的加载和读取与适当的类型的每一列。

加载文件scan1.dat并在文本编辑器中预览其内容。屏幕截图如下所示。

文件名= fullfile (matlabroot,“例子”'MATLAB''scan1.dat');

打开文件,并使用适当的转换说明符读取每一列。textscan回报1乘9单元阵列C

文件标识= fopen(文件名);C = textscan(文件标识,'%s %s %f32 %d8 %u %f %f %s %f');文件关闭(文件标识);谁C
名称大小字节类属性C 1x9 2249单元格

查看在每个单元的的数据MATLAB®类型C

C
C =1×9单元第1列到第5列{3x1 cell} {3x1 cell} {3x1 single} {3x1 int8} {3x1 uint32} {3x1 double} {3x1 double} {3x1 cell} {3x1 double} {3x1 double}

检查各个条目。请注意,13 C {1}13 C {2}是细胞阵列。C {5}是数据类型的uint32的前两个元素C {5}a的最大值是多少32-位无符号整数,或intmax (“uint32”)

celldisp(C)
C {1} {1} = 09/12/2005 C {1} {2} = 10/12/2005 C {1} {2} {3} = 11/12/2005 C{1} =使C{2}{2}{2}{3} =二级C = C Level3 {3} = 12.3400 23.5400 34.9000 C {4} = 45 60 12 C {5} = 4294967295 4294967295 200000 C{6} =正从10 C{7} =南0.0010 - 100.0000 C {8} {1} = Yes C{8}{2} =没有C{8}{3} =没有C{9} = 5.1000 + 3.0000我2.2000 - 0.5000 3.1000 + 0.1000

删除文字文本'水平'来自前一个示例中数据的第二列中的每个字段。该文件的预览如下所示。

打开文件,并匹配在formatSpec输入的文字文本。

文件名= fullfile (matlabroot,“例子”'MATLAB''scan1.dat');文件标识= fopen(文件名);C = textscan(文件标识,'%s Level%d %f32 %d8 %u %f %f %s %f');文件关闭(文件标识);13 C {2}
ANS =3x1 int32列向量1 2 3

查看第二个单元格的MATLAB®数据类型C。的第二个细胞1乘9单元阵列,C是数据类型的现在int32

disp(类(C {2}))
int32

将前一个示例中文件的第一列读入单元格数组,跳过其余行。

文件名= fullfile (matlabroot,“例子”'MATLAB''scan1.dat');文件标识= fopen(文件名);日期= textscan(FILEID,'%S%* [^ \ n]的');文件关闭(文件标识);日期{1}
ANS =3 x1单元阵列{'09 / 12/2005 '} {'10 / 12/2005'} {'11 / 12 / 2005' }

textscan返回单元格数组日期。

加载文件data.csv并在文本编辑器中预览其内容。屏幕截图如下所示。注意,该文件包含用逗号分隔的数据,也包含空值。

阅读文件,转换空单元格

文件名= fullfile (matlabroot,“例子”'MATLAB''data.csv');文件标识= fopen(文件名);C = textscan(文件标识,'%f %f %f %f %u8 %f'“分隔符””、““EmptyValue”、负);文件关闭(文件标识);column4 = C{4}, column5 = C{5}
column4 =2×14 -Inf
column5 =2x1 uint8列向量0 11

textscan回报1×6单元阵列,C。该textscan函数将空值转换为13 C {4},在那里13 C {4}与浮点格式相关联。因为MATLAB®表示无符号整数作为0textscan转换的空值C {5}0, 并不是

加载文件data2.csv并在文本编辑器中预览其内容。屏幕截图如下所示。注意,该文件包含可以解释为注释和其他条目的数据,比如“NA”要么“na”这可能表示字段为空。

文件名= fullfile (matlabroot,“例子”'MATLAB'“data2.csv”);

指定的输入端,textscan应该当作注释或空值和数据扫描到C

文件标识= fopen(文件名);C = textscan(文件标识,'%s %n %n %n %n'“分隔符””、““TreatAsEmpty”,{“NA”“na”},“CommentStyle”'//');文件关闭(文件标识);

显示输出。

celldisp(C)
13 C {1} {1} = ABC 13 C {1} {2} = DEF 13 C {2} = 2的NaN 13 C {3} = NaN的5℃{4} = 3 6 13 C {5} = 4 7

加载文件data3.csv并在文本编辑器中预览其内容。屏幕截图如下所示。注意,该文件包含重复的分隔符。

文件名= fullfile (matlabroot,“例子”'MATLAB'“data3.csv”);

为了治疗反复逗号作为一个分隔符,使用MultipleDelimsAsOne参数,并且将该值设置为1真正的)。

文件标识= fopen(文件名);C = textscan(文件标识,'%F%F%F%F'“分隔符””、““MultipleDelimsAsOne”1);文件关闭(文件标识);celldisp(C)
C{1} = 1 5 C{2} = 2 6 C{3} = 3 7 C{4} = 4 8

加载数据文件grades.txt对于本例,并在文本编辑器中预览其内容。屏幕截图如下所示。注意,该文件包含重复的分隔符。

文件名= fullfile (matlabroot,“例子”'MATLAB'“grades.txt”);

使用该格式读取列标头' % s '四次。

文件标识= fopen(文件名);formatSpec =' % s ';N = 4;formatSpec C_text = textscan(文件标识,N,“分隔符”“|”);

读取文件中的数字数据。

C_data0 = textscan(文件标识,'%d%F%F%F'
C_data0 =1×4细胞{4x1 int32} {4x1双}{4x1双}{4x1双}{4x1双}

的默认值CollectOutput0),所以textscan在一个单独的数组中返回数值数据的每一列。

将文件位置指示器设置为文件的开头。

frewind(文件标识);

该文件和组CollectOutput重读为1(真)来收集同一类的连续列到单个阵列。您可以使用repmat函数表示% f转换说明应该会出现三次。当格式重复多次这个技术是很有用的。

C_text = textscan(FILEID,' % s ',N,“分隔符”“|”);C_data1 = textscan(文件标识,' % d 'repmat (' % f '[1,3])),“CollectOutput”,1)
C_data1 =1×2细胞{4x1 int32} {4x3双}

测试分数,这是所有双,被收集到一个单一的4×3阵列。

关闭该文件。

文件关闭(文件标识);

从文本文件中读取数据的第一个和最后一列。跳过一列文本和整数数据的列。

加载文件names.txt并在文本编辑器中预览其内容。屏幕截图如下所示。注意,该文件包含两列带引号的文本,后面是一列整数,最后是一列浮点数。

文件名= fullfile (matlabroot,“例子”'MATLAB'“names.txt”);

读取文件中的第一列和最后一列数据。使用转换说明符,%问读取由双引号包围的文本()。%* Q跳过引用的文字,%* d跳过整数字段,并且% f读取浮点数。属性指定逗号分隔符“分隔符”名称 - 值对的参数。

文件标识= fopen(文件名,'R');C = textscan(文件标识,'%Q%* Q *%d%f的“分隔符””、“);文件关闭(文件标识);

显示输出。textscan返回单元格数组C其中包含文本的双引号被删除。

celldisp(C)
C{1}{1} = Smith, J. C{1}{2} = Bates, G. C{1}{3} =居里,M. C{1}{4} = Murray, G. C{1}{5} = Brown, K. C{1}0 = 71.1000 69.3000 64.1000 133.0000 64.9000

加载文件german_dates.txt并在文本编辑器中预览其内容。屏幕截图如下所示。请注意,值的第一列包含日期在德国的第二和第三列是数值。

文件名= fullfile (matlabroot,“例子”'MATLAB''german_dates.txt');

打开文件。指定与文件关联的字符编码方案作为最后的输入FOPEN

文件标识= fopen(文件名,'R'“n”“iso - 8859 - 15”);

阅读该文件。使用指定文件中的日期格式%{DD%MMMM YYYY} d符。指定使用日期的语言环境DateLocale名称 - 值对的参数。

C = textscan(文件标识,'%{DD MMMM YYYY} d%F%F'“DateLocale”'de_DE' 对应“分隔符””、“);文件关闭(文件标识);

查看c语言中第一个单元格的内容。MATLAB使用的语言中显示的日期取决于您的系统语言环境。

13 C {1}
ANS =3X1日期时间阵列2014年1月01日2014年2月01日2014年3月01日

采用的sprintf转换数据中的非默认转义序列。

创建包含表单提要字符的文本,\ f。然后,读课文用textscan,通话的sprintf以显式地转换表单提要。

歌词= sprintf的('黑鸟\ fsinging \鳍\ fthe \ fdead \ FOF \ fnight');C = textscan(抒情,' % s '“分隔符”sprintf ('\F'));13 C {1}
ANS =7 x1单元阵列{ '黑鸟'} { '唱歌'} { '在'} { '的'} { '死'} { '的'} { '夜'}

textscan返回一个单元阵列,C

从恢复比期初以外的位置进行扫描。

如果你继续扫描文本,textscan每次都从头开始读。若要从任何其他位置恢复扫描,请在对的初始调用中使用双输出参数语法textscan

例如,创建称为字符向量歌词。读取字符向量的第一个单词,然后继续扫描。

抒情="夜深人静时画眉歌唱";[firstword,POS] = textscan(歌词,' % 9 c '1);lastpart = textscan(抒情(pos + 1:结束),' % s ');

输入参数

全部折叠

打开的文本文件的文件标识符,指定为一个数字。在读取文件之前textscan,您必须使用FOPEN以打开该文件并获取文件标识

数据类型:

数据字段的格式,指定为一个或多个转换说明符的字符向量或字符串。当textscan读取输入后,它将尝试将数据匹配到指定的格式formatSpec。如果textscan不匹配的数据字段,它停止阅读并返回各领域的失败之前阅读。

转换说明的数目决定输出阵列中的单元的数目,C

数值字段

此表列出数字输入的可用转换说明符。

数字输入类型 转换符 输出类
整数,签署了 % d int32
% d8 INT8
% d16 int16
% d32 int32
% d64 int64
整型,无符号 % u uint32
U8% uint8
%U16 uint16
% u32 uint32
% u64 uint64
浮点数 % f
%F32
% f64
% n

非数字字段

此表列出了包含非数字字符的输入的可用转换说明符。

非数字输入类型 转换符 细节
字符 % c 阅读任何单个字符,包括分隔符。
文本数组 % s 读取为字符向量的单元数组。
%问

读取为字符向量的单元数组。如文本以双引号(),省略前导引号和与之配套的封闭标记,这是一个孤双引号的第二个实例。更换逃脱双引号(例如,”“abc”“)与孤独的双引号(“ABC”)。%问忽略在结束双引号之后出现的任何双引号。

例子:“% q”读取“‘乔‘’闪电’‘史密斯,小’”作为“小‘闪电’乔·史密斯。”

日期和时间 % D

以同样的方式阅读%问以上,然后转换为一个日期时间值。

% {fmt}D

以同样的方式阅读%问,然后将其转换为日期时间值。fmt描述输入文本的格式。该fmt输入是字母标识符的字符向量是为有效的值格式日期时间的属性。textscan将文本转换不符合此格式的NaT值。

有关datetime显示格式的更多信息,请参见格式属性,用于日期时间数组。

例子:' % {dd-MMM-yyyy} D '指定日期的格式,如' 01 - 1月- 2014

持续时间 %T

以同样的方式阅读%问,然后转换为持续时间值。

% {fmt}T

以同样的方式阅读%问,然后将其转换为持续时间值。fmt描述输入文本的格式。该fmt输入是字母标识符的字符向量是为有效的值格式持续时间的属性。textscan将文本转换不符合此格式为NaN值。

有关持续时间显示格式的详细信息,请参见格式属性用于持续时间数组。

例子:' % {hh: mm: ss} T '指定持续时间的格式,如“10:30:15”,其表示10小时,30分钟,15秒。

类别 % C

以同样的方式阅读%问,然后转换为类别名称的分类排列。textscan转换<未定义>文本到输出类别数组中未定义的值。

模式匹配 % […]

读取为字符向量的单元数组,方括号内的字符直到第一个非匹配字符。包括]在集合中,先指定:% []…]

例子:%(亩)读取“夏”作为“夏”

%[^ ...]

排除括号内的字符,一直读到第一个匹配的字符。排除],首先指定它:% [^]…]

例子:% (^ xrg]读取“夏”作为“summe”

可选的运营商

转换指定的formatSpec可以包括可选的操作符,它们按如下顺序出现(为了清晰起见,包括空格):

可选的经营范围包括:

  • 字段和字符来忽略

    textscan读取顺序文件中的所有字符,除非你告诉它忽略某个领域或场的一部分。

    插入百分号(%)后的星号(*)来跳过一个字段或一个字符字段的一部分。

    操作符

    所采取的行动

    % *ķ

    跳过这个领域。ķ任何标识要跳过的字段的转换说明符。textscan不创建任何这样的字段的输出单元。

    例子:'%s %s %s %s %s %s %s'(空格是可选的)转换文本
    "夜深人静时画眉歌唱"分为四个输出单元
    《黑夜》中的黑鸟

    “%*ñS'

    跳过了ñ字符,其中ñ是小于或等于字段中字符数的整数。

    例子:% * 3年代% s转换'ABCDEFG'“defg”。当分隔符为逗号,同样的分隔符转换'ABCDE,fghijkl'到包含'去'; 'IJKL'

    “%*ñc '

    跳过ñ字符,包括分隔符。

  • 字段宽度

    textscan读取由字段宽度或精度指定的字符或数字的数目,或读到第一个分隔符(以先出现的为准)。小数点,符号(+要么-),指数字符,并在数字指数数字被算作域宽度内的字符和数字。对于复数,场宽度指的是实部和虚部的各宽度。为虚部,场宽度包括+或 - 但不是一世要么Ĵ。通过在转换说明符的百分比字符(%)后面插入一个数字来指定字段宽度。

    例子:% 5 f读取“123.456”作为123.4

    例子:% 5度读取'ABCDEFG'作为”中的“

    当字段宽度操作符与单个字符一起使用时(% c),textscan还可以读取分隔符、空白和行尾字符。
    例子:% 7 c读7个字符,包括空格,因此“昼夜”读起来像“天”

  • 精确

    对于浮点数(% n% f%F32% f64),你可以指定的小数位数阅读。

    例子:% 7.2度读取“123.456”作为123.45

  • 文字文本到忽略

    textscan属性后附加的文本formatSpec转换说明符。

    例子:%与水平读取“使”作为1

    例子:%u8Step读取的2个步骤作为2

数据类型:字符|字符串

次数申请formatSpec,指定为一个正整数。

数据类型:||INT8|int16|int32|int64|uint8|uint16|uint32|uint64

输入要读取的文本。

数据类型:字符|字符串

名称 - 值对参数

指定可选的用逗号分隔的对名称,值参数。名称参数名和价值是对应的值。名称必须出现在引号内。可以按任意顺序指定多个名称和值对参数Name1, Value1,…,的家

例子:C = textscan(文件标识、formatSpec HeaderLines, 3,“分隔符”,“,”)跳过数据的前三行,然后读取其余数据,将逗号作为分隔符。

名称不区分大小写。

逻辑指示符决定数据连接,指定由逗号分隔的对组成“CollectOutput”,要么真正的要么。如果真正的,然后进口函数连接相同的基本MATLAB的连续输出单元®类化为单个数组。

表示忽略文本的符号,由逗号分隔的对组成“CommentStyle”和字符向量,特征向量,字符串或字符串数​​组的单元阵列。

例如,指定一个字符,如'%'忽略文本在同一行的符号以下。指定两个字符载体,如的单元阵列{ '/ *', '* /'},以忽略这些序列之间的任何文本。

MATLAB检查不是场内仅在每个字段的开始评论。

例子:CommentStyle, {“/ *”、“* /”}

数据类型:字符|字符串

用于读取日期的区域设置,指定为逗号分隔的对“DateLocale”和形式的字符向量XX_YY,在那里XX是小写的ISO 639-1两字母代码,指定一种语言,和YY是大写ISO 3166-1的α-2代码指定的国家。对于语言环境共同值的列表,请参阅语言环境的名称 - 值对参数datetime功能。

采用DateLocale指定在使用阅读文本的日期时,应textscan解释星期名称和缩写的月份和日期的语言环境% D格式说明符。

例子:“DateLocale”、“ja_JP”

字段分隔符,指定为逗号分隔的一对组成的“分隔符”和字符向量或特征向量的单元阵列。指定字符向量的单元阵列的多个定界符。

例子:“分隔符”,{‘;’,‘*’}

textscan将重复的分隔符解释为单独的分隔符,并向输出单元格返回空值。

在每一行数据,默认的字段分隔符是空白。白色空间可以是空间任意组合(“”),退格(“\ b”),或tab (' \ t ')字符。如果不指定分隔符,则:

  • 分隔符与空白字符相同。默认的空白字符是“”“\ b”,' \ t '。使用“空格”指定备用空白字符的名称-值对参数。

  • textscan将重复的空白字符解释为单个分隔符。

当您指定下列转义序列之一作为分隔符时,textscan转换该序列相应的控制字符:

\ b 退格
\ n 新队
r \ 回车
\ t 选项卡
\ \ 反斜杠(\

数据类型:字符|字符串

在分隔的文本文件中为空的数字字段返回值,指定为逗号分隔的对“EmptyValue”和一个标量。

行尾字符,由逗号分隔的对组成“EndOfLine”和一个字符向量或字符串。字符向量必须是“\ r \ n”或者它必须指定单个字符。常见的行尾字符是换行字符('\ n')或回车(' \ r ')。如果您指定“\ r \ n”,则导入函数处理任何r \\ n,两者的结合(\ r \ n)作为行尾字符。

默认的行尾序列是\ nr \, 要么\ r \ n,这取决于文件的内容。

如果存在缺少值,并在文件的最后一行的末尾的结束线序,然后进口函数返回这些字段为空值。这确保了单个细胞在输出单元阵列,C,大小相同。

例子:'行结束',':'

数据类型:字符|字符串

指数字符,由逗号分隔的对组成'ExpChars'和一个字符向量或字符串。默认的指数字符是ËËd,d

数据类型:字符|字符串

标题行数,由逗号分隔的对组成'HeaderLines'一个正整数。textscan跳过标题行,包括当前行的其余部分。

多个分隔符处理,指定为逗号分隔的对“MultipleDelimsAsOne”,要么真正的要么。如果真正的,则导入函数将连续分隔符视为单个分隔符。由空白分隔的重复分隔符也被视为单个分隔符。还必须指定分隔符选择。

例子:“MultipleDelimsAsOne”, 1

当行为textscan无法读取或转换,指定为逗号分隔的对“ReturnOnError”,要么真正的要么。如果真正的textscan在没有错误的情况下终止,并返回所有读取的字段。如果textscan带错误终止,不返回输出单元格数组。

占位符文本以治疗为空值,指定为逗号分隔的一对组成的“TreatAsEmpty”和字符向量,特征向量,字符串或字符串数​​组的单元阵列。此选项仅适用于数字字段。

数据类型:字符|字符串

空白字符,指定为逗号分隔的一对组成的“空格”和字符向量或字符串包含一个或多个字符。textscan添加空格字符,char (32),任何指定的空格,除非空格是空的 (),formatSpec包括任何转换说明符。

当您指定以下转义序列之一的任何空白字符,textscan转换该序列相应的控制字符:

\ b 退格
\ n 新队
r \ 回车
\ t 选项卡
\ \ 反斜杠(\

数据类型:字符|字符串

输出文本的数据类型,指定为由逗号分隔的对组成“TextType”,要么“字符”要么“字符串”。如果你指定了值“字符”,然后textscan返回文本字符向量的单元阵列。如果你指定了值“字符串”,然后textscan返回文本类型的数组字符串

输出参数

全部折叠

文件或文本数据,返回为单元阵列。

中的每个数值转换说明符formatSpec,textscan函数返回一个ķ×1 MATLAB数值向量到输出单元阵列,C,在那里ķ是多少次呢textscan找到字段匹配说明符。

对于每个文本转换说明(% s%问, 要么% […])在formatSpec,textscan函数返回一个ķ-1个字符向量的单元数组,其中ķ是多少次呢textscan找到字段匹配说明符。对于每个字符转换,其包括场宽度操作,textscan回报ķ——- - - - - -中号字符数组,中号是字段宽度。

中的每个日期时间或分类转换说明符formatSpec,textscan函数返回一个ķ×1 datetime或分类矢量向输出单元阵列,C,在那里ķ是多少次呢textscan找到字段匹配说明符。

在扫描结束时的位置,在文件或字符向量中,作为类的整数返回。对于文件,ftell(FILEID)调用后将返回相同的值吗textscan。对于一个字符向量,位置表明有多少个字符textscan读。

算法

textscan根据MATLAB中有关溢出、截断和使用的规则,将数值字段转换为指定的输出类型为NaN,。例如,MATLAB表示一个整数为NaN为零。如果textscan查找与整数格式说明符(例如% d要么% u),它返回一个空值为零,而不是为NaN

当匹配数据到文本转换说明符,textscan读取,直到找到分隔符或行尾字符。当将数据与数值转换说明符匹配时,textscan读取,直到找到一个非数字字符。当textscan无法将数据与特定的转换说明符匹配,则尝试将数据与?中的下一个转换说明符匹配formatSpec。标志 (+要么-)、指数字符和小数点被认为是数字字符。

标志 数字 小数点 数字 指数的性格 标志 数字
读取一个符号字符,如果它存在。 阅读一个或多个数字。 如果存在小数点,请读取它。 如果有小数点,请阅读紧跟其后的一个或多个数字。 如果存在一个阅读指数字符。 如果有指数字符,则读取一个符号字符。 如果有一个指数字符,读取一个或多个它后面的数字。

textscan将任何复数作为一个整体导入复杂的数字字段,将实部和虚部转换为指定的数字类型(例如% d要么% f)。复数的有效表格如下:

±<真正>±<图像放大>我| j

例子:5.7-3.1i

±<图像放大>我| j

例子:-7j

不要在复数中包含嵌入的空白。textscan将嵌入的空白解释为字段分隔符。

之前介绍过的R2006a