【问题标题】:Missing information after reading text file with textscan (Matlab)使用 textscan (Matlab) 读取文本文件后丢失信息
【发布时间】:2016-07-20 03:51:28
【问题描述】:

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

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

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

我的错误在哪里?

【问题讨论】:

  • 您使用的是哪个版本的 MATLAB?
  • @Amro:是Matlab版本R2015a
  • 在这种情况下,我们可以使用tabledatetime 对象。让我发布一个解决方案

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


【解决方案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

【讨论】:

  • 感谢您的回答,但不幸的是,我已经尝试了您的解决方案,但出现以下错误:“使用 readtable 时出错。无法读取整个文件。您可能需要指定不同的格式字符串、分隔符或标题行数。'
  • 您的文件格式究竟是什么?你有标题行吗?您需要逐字向我们展示 实际文件 的前几行,而不是随机提取的内容...以上内容适用于您在问题中发布的示例。我们只能使用您向我们展示的内容!
  • 是的,对不起,我的文件在第一行有一个标题。文件的其余部分与我的示例中发布的格式相匹配。我尝试了以下方法:t = readtable(filename, 'FileType','text', 'Delimiter',',', ... 'Format','%f %{dd/MM/yyyy HH:mm}D %{dd/MM/yyyy HH:mm}D', ... 'ReadVariableNames',false,'HeaderLines',1);但我仍然得到错误。
  • 新的错误如下:“无法读取格式为'dd/MM/yyyy HH:mm'的DATATIME数据。如果数据不是时间,使用%q获取字符串数据”
  • 不,您需要将ReadVariableNames 设置为true(在这种情况下不要使用HeaderLines)。再次,请编辑问题并向我们显示文件的标题行以及数据!实际的东西..
【解决方案2】:

首先你有逗号作为分隔符,最好在 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,:); 

因此,您也会得到一个元胞数组。

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多