如何在MATLAB中将文件排序到多个文件夹?

AP.*_*AP. 1 directory file-io matlab

我很少遇到问题.我每天都会生成大量文件,我需要按文件名和日期对它们进行排序.我需要这样做,所以我的MATLAB脚本可以读取它们.我目前手动执行此操作,但想知道在MATLAB中是否有更简单的方法来排序和复制文件.

我的文件名看起来像:

data1_2009_12_12_9.10
data1_2009_12_12_9.20
data1_2009_12_12_9.30
data1_2009_12_12_9.40
data2_2009_12_12_9.10
data2_2009_12_12_9.20
data2_2009_12_12_9.30
data2_2009_12_12_9.40
data3_2009_12_12_9.10
data3_2009_12_12_9.20
data3_2009_12_12_9.30
data3_2009_12_12_9.40
...
Run Code Online (Sandbox Code Playgroud)

和这样的大量文件.

除上述问题外:

必须有一种更简单的方法将文件拼接在一起.我的意思是在文件'data1_2009_12_12_9.10'之后复制文件'data1_2009_12_12_9.20',依此类推,...这样我留下了一个名为data1_2009_12_12(或者其他)的巨大txt文件.包含拼接在一起的所有数据.现在我知道要做的唯一方法是在matlab中打开所有带有单独dlmread命令的文件,然后xls一个接一个地写(或者手动复制粘贴的更简单的方法)

gno*_*ice 6

在功能成像研究领域工作,我经常不得不将大量文件分类为特定的处理顺序.下面是一个如何查找文件,解析某些标识符字符串的文件名,然后按给定条件对文件名进行排序的示例...

收集文件......

您可以使用DIR函数首先从目录中获取所有文件名的列表:

dirData = dir('your_directory');      %# Get directory contents
dirData = dirData(~[dirData.isdir]);  %# Use only the file data
fileNames = {dirData.name};           %# Get file names
Run Code Online (Sandbox Code Playgroud)

使用正则表达式解析文件名...

您的文件名似乎具有以下格式:

'data(an integer)_(a date)_(a time)'
Run Code Online (Sandbox Code Playgroud)

所以我们可以使用REGEXP来解析与上述格式匹配的文件名,并提取下面的整数data,日期的三个值和时间的两个值.因此,用于匹配的表达式将为每个有效文件名捕获6个"标记":

expr = '^data(\d+)\_(\d+)\_(\d+)\_(\d+)\_(\d+)\.(\d+)$';
fileData = regexp(fileNames,expr,'tokens');  %# Find tokens
index = ~cellfun('isempty',fileData);        %# Find index of matches
fileData = [fileData{index}];                %# Remove non-matches
fileData = vertcat(fileData{:});             %# Format token data
fileNames = fileNames(index);                %# Remove non-matching file names
Run Code Online (Sandbox Code Playgroud)

基于令牌排序......

您可以将上面的字符串标记转换为数字(使用STR2DOUBLE函数),然后将日期和时间值转换为日期编号(使用函数DATENUM):

nFiles = size(fileData,1);              %# Number of files matching format
fileData = str2double(fileData);        %# Convert from strings to numbers
fileData = [fileData zeros(nFiles,1)];  %# Add a zero column (for the seconds)
fileData = [fileData(:,1) datenum(fileData(:,2:end))];  %# Format dates
Run Code Online (Sandbox Code Playgroud)

该变量fileData现在将是一个nFiles数字值的二元矩阵.您可以使用SORTROWS函数对这些值进行排序.以下代码将首先按字后面的整数排序data,然后按日期编号排序:

[fileData,index] = sortrows(fileData,1:2);  %# Sort numeric values
fileNames = fileNames(index);               %# Apply sort to file names
Run Code Online (Sandbox Code Playgroud)

连接文件......

fileNames变量现在包含给定目录中与所需文件名格式匹配的所有文件的单元格数组,首先按字后面的整数排序data,然后按日期排序.如果您现在想要将所有这些文件连接成一个大文件,您可以尝试使用SYSTEM函数调用系统命令来为您执行此操作.如果您使用的是Windows机器,你可以不喜欢我在描述这个回答另一个问题,SO,我告诉你如何使用DOS 命令连接文本文件.您可以尝试以下内容:

inFiles = strcat({'"'},fileNames,{'", '});  %# Add quotes, commas, and spaces
inFiles = [inFiles{:}];                     %# Create a single string
inFiles = inFiles(1:end-2);                 %# Remove last comma and space
outFile = 'total_data.txt';                 %# Output file name
system(['for %f in (' inFiles ') do type "%f" >> "' outFile '"']);
Run Code Online (Sandbox Code Playgroud)

这应该创建一个单独的文件,total_data.txt其中包含各个文件中的所有数据,这些文件按其名称出现在变量中的顺序连接在一起fileNames.请记住,每个文件可能都必须以新行字符结束才能正确连接.