使用textscan(Matlab)阅读文本文件后缺少信息

时间:2016-03-31 15:30:47

标签: matlab file-io text-files data-import textscan

我正在尝试读取逗号分隔的文本文件,但我的结果中缺少信息。

以下是我的文本文件的摘录:

number,datetime start,datetime arrive
4027,25/03/2016 11:20,25/03/2016 11:20
4000,25/03/2016 11:20,25/03/2016 11:20
4027,25/03/2016 11:21,25/03/2016 11:21
4000,25/03/2016 11:21,25/03/2016 11:21

我的代码:

file = fopen('myfile.txt');
TextCell=textscan(file,'%s');
Text=TextCell{1}; 
fclose(file);

containsStr = ~cellfun('isempty',strfind(Text,'4027')); 
FilteredText=Text(containsStr); % filters the strings that contain 4027

获得的结果:

4027,25/03/2016
4027,25/03/2016

预期结果:

4027,25/03/2016 11:20,25/03/2016 11:20
4027,25/03/2016 11:21,25/03/2016 11:21

我的错误在哪里?

2 个答案:

答案 0 :(得分:1)

给出以下CSV文件:

number,datetime start,datetime arrive
4027,25/03/2016 11:20,25/03/2016 11:20
4000,25/03/2016 11:20,25/03/2016 11:20
4027,25/03/2016 11:21,25/03/2016 11:21
4000,25/03/2016 11:21,25/03/2016 11:21

我们将数据加载到MATLAB table中。我们指定格式以将最后两列解析为datetime个对象。

t = readtable('file.csv', 'FileType','text', 'Delimiter',',', ...
    'Format','%f %{dd/MM/yyyy HH:mm}D %{dd/MM/yyyy HH:mm}D');

结果:

>> t
t = 
    number     datetimeStart       datetimeArrive 
    ______    ________________    ________________
    4027      25/03/2016 11:20    25/03/2016 11:20
    4000      25/03/2016 11:20    25/03/2016 11:20
    4027      25/03/2016 11:21    25/03/2016 11:21
    4000      25/03/2016 11:21    25/03/2016 11:21

(您可能会看到有关标识符被修复的警告,这是无害的。原因是标题行中的名称包含空格,并且这些名称在变量名称中无效。)

最后,我们选择第一列等于4027的行:

>> tt = t(t.number == 4027,:)
tt = 
    number     datetimeStart       datetimeArrive 
    ______    ________________    ________________
    4027      25/03/2016 11:20    25/03/2016 11:20
    4027      25/03/2016 11:21    25/03/2016 11:21

答案 1 :(得分:0)

首先你用逗号作为分隔符,最好在textscan中使用。然后,您应该在文本文件中指定数据列。此外,我将使用CollectOutput选项来获取相同单元格数组中的数据。请检查以下代码:

file = fopen('myfile.txt');
TextCell=textscan(file,'%s %s %s %s %*[^\n]', 'Delimiter',',', 'CollectOutput',1);
Text=TextCell{1}; 
fclose(file);

containsStr = ~cellfun('isempty',strfind(Text,'4027')); 
FilteredText=Text(containsStr,:); 

因此,您将获得一个单元格数组。