NATSORTFILES例子

这个函数NATSORTFILES对文件名或文件路径(1xN char)的单元格数组进行排序,考虑字符串中的任意数字值。这被称为a自然顺序排序或者一个字母数字排序.注意MATLAB是内置的排序函数只对字符代码进行排序排序在大多数编程语言中)。

NATSORTFILES不是简单的自然顺序排序,而是将文件名和文件扩展名分开和排序,这意味着NATSORTFILES将较短的文件名排在较长的文件名之前:这被称为字典排序.出于同样的原因,文件路径在每个路径分隔符(或“\”' / '),每个目录级别分别排序。有关更多细节,请参阅下面的“解释”部分。

用于对单元格数组的行进行排序NATSORTROWS

用于对字符串的单元格数组进行排序的作用

内容

基本用法

默认情况下NATSORTFILES将连续的数字解释为单个整数的一部分,任何剩余的子字符串/s都被视为字符:

一个= {“a2.txt”“a10.txt”“a1.txt”};sort () natsortfiles (A)
Ans = 'a1.txt' 'a10.txt' 'a2.txt' 'a10.txt'

输出2:Sort Index

第二个输出参数是一个排序索引的数字数组ndx,这样Y = X (ndx)在哪里Y = natsortfiles (X)

[~, ndx] = natsortfiles (A)
1 . NDX = 2

输出3:调试数组

第三个输出是单元格数组的单元格向量,其中单元格数组对应于目录层次结构、文件名和文件扩展名。单元格数组包含所有匹配的数字(使用指定的SSCANF格式)和所有拆分字符子字符串。这些单元格数组对于确认正则表达式正确识别数字非常有用。注意,偶数列包含任何匹配的数字值,而奇数列包含任何分割子字符串:

[~, ~, dbg] = natsortfiles(一个);dbg {:}
ans = a [2] a [10] a [1] ans = ' . txt ' ' . txt ' ' . txt '

输入2:正则表达式

第二个可选输入参数是一个指定匹配数字的正则表达式:

B = {“1.3.txt”“1.10.txt”“1.2.txt”};natsortfiles (B)%默认匹配整数natsortfiles (B,“\ d + \ ?。\ d *’匹配小数
ans = ' 1.2.txt ' ' 1.3.txt ' ' 1.10.txt ans =“1.10.txt”“1.2.txt”“1.3.txt”

输入3+:可选参数

进一步的输入直接传递给的作用,从而控制大小写敏感性、排序方向和其他选项。看到的作用支持选项的解释和示例帮助:金宝app

C = {“B.txt”“10. txt”“1. txt”“A.txt”“2. txt”};natsortfiles (C []“下”) natsortfiles (C []“char < num”
ans = ' B.txt ' ' A.txt“10. txt”“2. txt”“1. txt”ans =“A.txt”“B.txt”“1. txt”“2. txt”“10. txt”

示例DIR和单元格数组

一种常见的情况是使用DIR要识别文件夹中的文件,按照正确的顺序对它们进行排序,然后对它们进行循环:下面是如何做到这一点的示例。记得preallocate在循环之前的所有输出数组!

P =“natsortfiles_test”%目录路径S = dir (fullfile (P,‘* . txt”));%获取目录中的文件列表C = natsortfiles ({S.name});将文件名按顺序排序k = 1:numel(C) disp(P,C{k}))结束
natsortfiles_test\A_1.txt natsortfiles_test\A_1-new.txt natsortfiles_test\A_1.txt natsortfiles_test\A_2.txt natsortfiles_test\A_3.txt natsortfiles_test\A_10.txt natsortfiles_test\A_100.txt natsortfiles_test\A_200.txt

使用DIR和结构的例子

需要访问的用户DIR结构字段可以使用NATSORTFILE要排序的第二个输出DIR的输出结构为正确的顺序:

P =“natsortfiles_test”%目录路径S = dir (fullfile (P,‘* . txt”));%获取目录中的文件列表[~, ndx] = natsortfiles ({S.name});%指数的顺序正确S = S (ndx);使用索引排序结构k = 1:numel(S) fprintf(“-13年代% % s \ n”, (k) . name,年代(k) .date)结束
22- 7 -2017 09:13:24 A_1.txt 22- 7 -2017 09:13:24 A_3.txt 22- 7 -2017 09:13:24 A_10.txt 22- 7 -2017 09:13:24 A_100.txt 22- 7 -2017 09:13:24 A_200.txt 22- 7 -2017 09:13:24 A_10.txt

解释:字典排序

文件名和文件扩展名由扩展名分隔符:句点字符“。”.使用正常排序周期被排序了从0到45的所有字符(包括!"#$%&'()*+,-例如空格字符和所有控制字符,例如换行符、制表符等)。这意味着简单的自然顺序排序将在较长文件名之后对一些短文件名进行排序。为了提供正确的字典排序,首先使用较短的文件名,NATSORTFILES从文件扩展名拆分文件名并分别排序:

D = {“test_ccc.m”“test-aaa.m”“test.m”“test.bbb.m”};排序(D)% '-'排序在'。'的作用(D)% '-'排序在'。'natsortfiles (D)%正确字典排序
ans = ' test-aaa。“test.bbb。“测试。”米“test_ccc.m”ans = ' test-aaa。“test.bbb。“测试。”米“test_ccc.m”ans = '测试。“test-aaa。“test.bbb。”米“test_ccc.m”

解释:文件名

NATSORTFILES将字典排序与自然排序组合,以便考虑文件名中的数字值:

E = {“test2.m”“test10-old.m”“test.m”“test10.m”“test1.m”};排序(E)数字顺序错误。的作用(E)正确的数字顺序,但先长后短。natsortfiles (E)正确的数字顺序和字典排序。
ans = '测试。“test1。”米“test10-old.m”“test10.m”“test2.m”ans = 'test1.m' 'test2.m' 'test10-old.m' 'test10.m' 'test.m' ans = 'test.m' 'test1.m' 'test2.m' 'test10.m' 'test10-old.m'

解释:Filepaths

出于同样的原因,文件路径在每个文件路径分隔符处被分割' / '“\”作为文件路径分隔符),目录结构的每一层都是分开排序的。这确保了目录名是按字典排序的,并且任何数字都被考虑在内:

F = {“A2-old \ test.m”“A10 \ test.m”“A2 \ test.m”“AXarchive.zip”“A1 \ test.m”};排序(F)%数字顺序错误,'-'排序在'\'之前:的作用(F)%正确的数字顺序,但先长后短。natsortfiles (F)正确的数字顺序和字典排序。
ans = ' A10 \测试。m“A1 \测试。m“A2-old \测试。m“A2 \测试。'A1\test. zip'm“A2-old \测试。m“A2 \测试。”米“A10 \ test.m”“AXarchive.zip”ans = 'AXarchive.zip' 'A1\test.m' 'A2\test.m' 'A2-old\test.m' 'A10\test.m'

正则表达式:十进制数字,电子符号,+/-符号

NATSORTFILES可以对数字匹配进行定制,以检测具有小数、e符号、+/-符号、二进制/十六进制或其他必需特征的数字。数字匹配使用适当的正则表达式指定:参见的作用详情和例子。

G = {“1.23 v.csv”“1 v.csv”“+ 1. csv”' + NaNV.csv '“1.200 v.csv”};natsortfiles (G)%默认匹配整数natsortfiles (G,(- +) ? (NaN |正| \ d + \ ? \ d *)”
ans = ' 1.23 v.csv ' ' 1.200 v.csv ' ' + 1. csv ' ' + NaNV.csv ' ' 1 v.csv ' ans =“1 v.csv”“+ 1. csv”“1.200 v.csv”“1.23”v.csv ' + NaNV.csv '

奖励:交互式正则表达式工具

正则表达式功能强大且紧凑,但正确使用它们并不总是容易的。一个帮助是下载我的互动工具IREGEXP,它可以让您快速尝试不同的正则表达式并查看所有正则表达式的输出显示和更新。