Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何读入多个文本文件并根据文件名中的时间戳将它们合并在一起_Matlab_File Io - Fatal编程技术网

Matlab 如何读入多个文本文件并根据文件名中的时间戳将它们合并在一起

Matlab 如何读入多个文本文件并根据文件名中的时间戳将它们合并在一起,matlab,file-io,Matlab,File Io,我有一个文件夹,其中包含大量文本文件,每个文件包含6个标题以及我要读取的数据: Phone timestamp;sensor timestamp [ns];channel 0;channel 1;channel 2;ambient 2021-02-15T12:37:32.401;536755331722174808;485232;501982;494303;16818; 2021-02-15T12:37:32.408;536755331729573094;485244;501970;494199

我有一个文件夹,其中包含大量文本文件,每个文件包含6个标题以及我要读取的数据:

Phone timestamp;sensor timestamp [ns];channel 0;channel 1;channel 2;ambient
2021-02-15T12:37:32.401;536755331722174808;485232;501982;494303;16818;
2021-02-15T12:37:32.408;536755331729573094;485244;501970;494199;16770;
2021-02-15T12:37:32.415;536755331736971380;485235;502069;494234;16735;
文件名的格式为“Data_20210213_120806”,即
Data_ummdd\u HHMMSS
。目前,我正在使用
uigetfile
手动读取数据,并按照正确的顺序(最早日期->最晚日期)选择文件,然后将每个文件连接在一起

这是好的,当我只有几个文件看,但不是很实际,当大量的文件存在。我想知道是否有一种方法可以自动读取每个文件(根据文件名中的日期以正确的顺序),并将它们合并到一个N×6矩阵中

手动读取数据的代码:

[filename1,pathname1] = uigetfile('*.txt','Please Choose the file to process');
filepath1 = fullfile(pathname1,filename1);
fileCell1= readcell(filepath1,'FileType','text','Delimiter',';');

% Define Structure.
Table = cell2table(fileCell1(2:end, :), 'VariableNames', fileCell1(1, :));

% Convert to Datetime
Table.("Phone timestamp") = datetime(strrep(Table.("Phone timestamp"), 'T', ' '));

如何实现此过程的自动化?

从文件夹中读取文本文件的过程可以通过使用循环并使用
dir()
函数检索所有
.txt
文本文件名来完成。如果可以提供示例文本文件的内容,则可以显示示例合并过程

clc;

%Grabbing all the text files in a folder named "Text Files"%
Folder_Name = 'Text Files';
%Asterisk, * used to indicate any prefix/wildcard is allowed%
Text_Files = dir(fullfile(Folder_Name,'*txt'));
File_Names = {Text_Files.name}.';

Date_Num_Representation = zeros(1,length(File_Names));

Format = 'yyyy-mm-dd HH:MM:SS';
for File_Index = 1: length(Text_Files)
    Name = erase(File_Names(File_Index),"Data_");
    Name = erase(Name,".txt");
    Name = char(strrep(Name,"_"," "));
    Name = Name(1:4) + "-" + Name(5:6) + "-" + Name(7:8) + Name(9:11) + ":" + Name(12:13) + ":" + Name(14:end);
    Date_Num_Representation(File_Index) = datenum(Name,Format);
end

[~,Indices] = sort(Date_Num_Representation);

Combined_Table = [];
for File_Index = 1: length(Text_Files)
Sorted_Index = Indices(File_Index);
Path = fullfile(Folder_Name,Text_Files(Sorted_Index).name);
New_Table = readtable(Path);
New_Table = New_Table(:,1:6);
Combined_Table = [Combined_Table; New_Table];
end

Combined_Table.Properties.VariableNames = {'Phone timestamp','sensor timestamp [ns]','channel 0','channel 1','channel 2','ambient'};
Combined_Table

%Might be useful%
%Combined_Table = table2cell(Combined_Table);%

这正是我应该做的,荣誉。一件小事:您需要以某种方式确保正确处理时间戳。Windows有一个烦人的问题,数字是按字母顺序存储的,而不是按数字存储的(
111221331
etc)。您只需抓取文件名的日期/时间部分,将其转换为
datenum
,对其进行排序,然后按顺序读取文件。非常感谢,似乎工作正常。有没有办法在for循环中将文件的每个迭代合并在一起?我认为这可能不是最有效的方法,可能会使matlab运行得非常慢,但我想不出其他方法。Ie:Final_File=[file1;file2;file3…File(长度(文本_文件))];这应该能解决排序问题,我还没能测试Windows上的排序,因为我的机器上的排序是用数字进行后缀排序的。非常感谢,效果非常好!你真的想要一个6×N的表格,即一个6行N列的MATLAB格式吗?查看文件内容时,您更愿意使用N-by-6,即6列,并且可能在将日期转换为
datenum
时使用一个简单的数字矩阵,而不是一个完整的
table()
。是的,我想您是对的,N-by-6数字矩阵可能是最好的使用方法。