【问题标题】:How can I read in multiple text files and merge them together based on Timestamps in the filename如何读取多个文本文件并根据文件名中的时间戳将它们合并在一起
【发布时间】:2021-03-03 12:16:17
【问题描述】:

我有一个文件夹,其中包含许多文本文件,每个文件包含 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_ YYMMDD_HHMMSS。目前,我刚刚使用uigetfile 手动读取数据并以正确的顺序(最早日期 -> 最新日期)选择文件并将每个文件连接在一起。

当我只有几个文件要查看时这很好,但当存在大量文件时不是很实用。我想知道有没有一种方法可以自动读取每个文件(根据文件名中的日期以正确的顺序)并将它们合并到一个 N -by- 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', ' '));

我怎样才能使这个过程自动化?

【问题讨论】:

  • 您真的想要一个 6×N 表,即 6 行 N 列的 MATLAB table() 格式吗?查看文件的内容,您宁愿使用 N×6,即 6 个 ,并且可能在将日期转换为 datenum 时使用简单的数字矩阵,而不是完整的-成熟的table().
  • 是的,我认为你是对的,数字 N×6 矩阵可能是最好的使用方法。

标签: matlab file-io


【解决方案1】:

从文件夹中读取文本文件的过程可以通过使用循环并使用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 有一个烦人的事情,即数字按字母顺序存储,而不是按数字存储(1 11 2 21 3 31 等)。您可以简单地获取文件名的日期/时间部分,转换为 datenum,对其进行排序,然后按该顺序读取文件。
  • 非常感谢,似乎运行良好。有没有办法在 for 循环中将文件的每次迭代合并在一起?我认为这可能不是最有效的方法,并且可能会使 matlab 运行速度非常慢,但我想不出另一种方法来做到这一点。即:Final_File = [file1;文件2;文件3...文件(长度(文本文件))];
  • 这应该可以解决排序问题,我无法测试 Windows 上的排序是否因为我的机器上的排序是以数字方式对后缀进行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 2017-02-15
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多