假设以下文件包含封闭区域的多边形表示:
1.0 3.5
0.9 -1.4
-4.9 -17.9
0.1 9.6
-9.7 13.3
8.9 11.2
-6.4 0.1
10.3 2.2
每个区域由块除以空行表示。我想使用正则表达式将每个块加载到矩阵/数组。但是,以下代码
file= fileread( 'test.txt' ) ;
bs= regexp( file, '[\n\r]+(*)', 'tokens' ) ;
bs= [bs{:}] ;
提供空bs
bs: empty 0 x 0, double
感谢您的帮助。
答案 0 :(得分:4)
我就是这样做的:
bs = cellfun(@str2num, regexp(file,'(\r?\n){2}','split'), 'UniformOutput', false);
因此,您基本上会因出现两个换行符(Linux)或两个返回换行符(Windows)而拆分。每个结果字符串都转换为带有str2num
的矩阵。
警告在此处按顺序排列:str2num
在内部调用eval
,因此可能会运行潜在的dangeours代码。例如,该文件可以包含! rm *
,并且将执行该文件。为避免这种情况,您可以检查文件是否只包含数字,空格字符,小数点和加号/减号:
valid = all(ismember(file, ['0':'9' 1:32 '.+-']));
并仅在valid
为true
的情况下继续。
代码给出了一个矩阵的单元阵列,每个块都在一个单元格中。对于您的示例文件,
>> celldisp(bs)
bs{1} =
1.000000000000000 3.500000000000000
0.900000000000000 -1.400000000000000
-4.900000000000000 -17.899999999999999
0.100000000000000 9.600000000000000
bs{2} =
-9.699999999999999 13.300000000000001
8.900000000000000 11.199999999999999
-6.400000000000000 0.100000000000000
10.300000000000001 2.200000000000000
答案 1 :(得分:2)
首先将文本拆分为提及的"块"。
可能更好data = strsplit(fileread('test.txt'), '\n\n');
areas = regexp(data, '(-?\d+\.\d+)[ ]+(-?\d+\.\d+)', 'tokens');
这将导致一个细胞细胞,每个细胞包含两个数字的细胞作为字符串。
{ { {'1.0', '3.5'} ,
{'0.9', '-1.4'} ,
... } ,
{ ... } }
所以我们需要将第二阶段单元格转换为数字数组,以便将它们作为矩阵使用。
areas = cellfun(@str2double, areas, 'UniformOutput', false);
......顺便说一下,你在搜索模式中对(*)
的意图是什么?