matlab 导入包含时间戳格式为HH:MM:SS的列的文本文件

mwngjboj  于 2023-04-06  发布在  Matlab
关注(0)|答案(1)|浏览(177)

我想导入一个txt文件,其中有一列的时间戳格式为HH:MM:SS。我已经尝试了一些不同的东西,但没有运气。希望有人能帮助,我已经附上了我试图导入的表和我尝试使用的matlab代码。

% Import the data from the text file
data = readtable('data.txt');

% Converting the time values to datetime format
time_values = datetime(data(:, 1), 'InputFormat', 'HH:mm:ss');

% Separating the remaining values into a separate variable or column
other_values = data(:, 2:end);
色谱柱AB栏
00.00.0113,05254116
00.00.0213,05254116
00.00.0313,05254116
00.00.0412,8976404
00.00.0512,8976404
00.00.0612,74349886
00.00.0712,74349886
00.00.0812,59011097
00.00.0912,43747122

寻求帮助解决我的问题

pcrecxhr

pcrecxhr1#

如果你没有指定导入选项,readtable()会扫描文件并尝试自己解决很多问题。有时它会出错,除非你明确解释如何解释文本。如果你尝试直接导入文件,你会得到这样的结果:

>> filename = 'timetableexample.txt' ;
data = readtable(filename)
data =
  9×2 table
         Var1            Var2  
    _______________    ________
    {'00.00.01 13'}     5254116
    {'00.00.02 13'}     5254116
      ...

这显然是错误的。在格式化文本文件时有几个问题,这些问题阻碍了readtable顺利导入这样的文本文件:
你的文件的第一个问题是每一行都会检测到逗号,,而readtable会将其解释为列delimiter。这就是为什么你尝试的直接导入最终会在错误的位置分割表。
为了解决这个问题,我们可以手动指定分隔符。我假设在你的文件中分隔符是一个space字符。如果真实的的分隔符是一个制表符,请相应地调整代码(使用'\t'而不是' ')。
首先,我们通过运行以下代码来获取delimitedTextImportOptions对象:

opts = detectImportOptions(filename) ;

您可以验证分隔符的自动检测是否确实错误:

>> opts.Delimiter
ans =
  1×1 cell array
    {','}

所以我们用正确的分隔符替换它:

opts.Delimiter = {' '} ;

现在,如果您尝试使用此新选项读取文件,列分隔是正确的,但导入仍然有问题:

>> data = readtable(filename,opts)
data =
  9×2 table
        Var1        Var2
    ____________    ____
    {'00.00.01'}    NaN 
    {'00.00.02'}    NaN

这是因为Matlab的默认小数点分隔符是点.,而不是许多欧洲国家使用的逗号,。为了纠正这一点,我们将告诉Matlab最初将列导入为文本(然后我们将修改文本,以便Matlab可以将其转换为数字)。
为此,我们需要修改另一个导入选项VariableTypes

>> opts.VariableTypes
ans =
  1×2 cell array
    {'char'}    {'double'}

我们将其替换为:

opts.VariableTypes = {'char','char'} ;

现在最后:

data = readtable(filename,opts)
data =
  9×2 table
        Var1             Var2      
    ____________    _______________
    {'00.00.01'}    {'13,05254116'}
    {'00.00.02'}    {'13,05254116'}

我们的列都正确导入了,但到目前为止只是作为文本导入。接下来,我们将替换每列中的非常规字符,并将它们替换为Matlab期望的当前类型(datetimedouble)。我们将使用函数strrep()来实现这一点。然后将此文本转换为正确的时间/值就变得很简单了。
我想是什么让你烦恼的是自动导入选项和你的特定文件格式之间的不匹配。现在解释一下,我不会逐行详细介绍代码,而是给予你导入这样一个文件的完整代码:

filename = 'timetableexample.txt' ;
opts = detectImportOptions(filename);
% modify the import options we need
opts.Delimiter = {' '} ;
opts.VariableTypes = {'char','char'} ;

data = readtable(filename,opts) ;   % read the table

strTime = table2cell(data(:,1)) ;   % extract column 1 in a cell array
strTime = strrep(strTime,'.',':') ; % replace '.' with ':'

% Now you can convert to datetime object
time_values = datetime(strTime, 'InputFormat', 'HH:mm:ss') ;

strData = table2cell(data(:,2)) ;   % extract column 2 in a cell array
strData = strrep(strData,',','.') ; % replace ',' with '.'

% Convert cell array of char into a double array
other_values = str2double(strData) ;

相关问题