【问题标题】:reading data from csv files with `textscan` in MATLAB在 MATLAB 中使用 `textscan` 从 csv 文件中读取数据
【发布时间】:2017-05-15 16:21:47
【问题描述】:

[已编辑:]我有一个文件data2007a.csv,我将前连续几行复制并粘贴(在 MacBook 中使用 TextEdit)到一个新文件 datatest1.csv 进行测试:

Nomenclature,ReporterISO3,ProductCode,ReporterName,PartnerISO3,PartnerName,Year,TradeFlowName,TradeFlowCode,TradeValue in 1000 USD
S3,ABW,0,Aruba,ANT,Netherlands Antilles,2007,Export,6,448.91
S3,ABW,0,Aruba,ATG,Antigua and Barbuda,2007,Export,6,0.312
S3,ABW,0,Aruba,CHN,China,2007,Export,6,24.715
S3,ABW,0,Aruba,COL,Colombia,2007,Export,6,95.885
S3,ABW,0,Aruba,DOM,Dominican Republic,2007,Export,6,11.432

我想使用textscan 将其读入 MATLAB,其中只有第 2、3、5 列(从第二行开始),我编写了以下代码

clc,clear all
fid = fopen('datatest1.csv');
data = textscan(fid,'%*s %s %d %*s %s %*[^\n]',...
       'Delimiter',',',...
       'HeaderLines',1);
fclose(fid);

但我最终只得到了第 2,3 和 5 列的第二行:


然后我将第一行保留在data2007a.csv 中并选择其他几个保存为datatest2.csv

Nomenclature,ReporterISO3,ProductCode,ReporterName,PartnerISO3,PartnerName,Year,TradeFlowName,TradeFlowCode,TradeValue in 1000 USD
S3,ABW,1,Aruba,USA,United States,2007,Export,6,1.392
S3,ABW,1,Aruba,VEN,Venezuela,2007,Export,6,5633.157
S3,ABW,2,Aruba,ANT,Netherlands Antilles,2007,Export,6,310.734
S3,ABW,2,Aruba,USA,United States,2007,Export,6,342.42
S3,ABW,2,Aruba,VEN,Venezuela,2007,Export,6,63.722
S3,AGO,0,Angola,DEU,Germany,2007,Export,6,105.334
S3,AGO,0,Angola,ESP,Spain,2007,Export,6,8533.125

我写道:

clc,clear all
fid = fopen('datatest2.csv');
data = textscan(fid,'%*s %s %d %*s %s %*[^\n]',...
       'Delimiter',',',...
       'HeaderLines',1);
fclose(fid);  
data{1}

它正是我想要的:

当我对原始数据文件data2007a.csv 使用相同的代码时,它与第一种情况一样。

出了什么问题,我该如何解决?


[添加:]如果重复我的实验1,可以发现两种情况都有效,问题不存在!真不知道怎么回事。

1对于“复制”,我的意思是复制并粘贴上面给出的数据并将其保存为两个新文件,例如datatest4a.csvdatatest4b.csv。我使用visdiff('datatest1.csv', 'datatest4a.csv') 比较两个文件并返回:

【问题讨论】:

  • 您的问题无法重现。我怀疑您在 MATLAB 中使用了不同的文件,并且您的实际文件不同。在您的帖子中,您说您有一个名为 data.csv 的文件,但在 MATLAB 中,您打开了 datatest.csv。我怀疑这不仅仅是一个错字
  • @Sardar_Usama:感谢您指出这一点。这确实是一个错字。我会马上修改。
  • 你错过了重点。您的问题无法重现
  • @Sardar_Usama:对不起,我不太明白你的评论。您能否详细说明“问题不可重现”的含义?
  • 它不会重现您在屏幕截图中显示的结果。相反,它会产生您正在寻找的结果,即它包含指定列的所有行(从第二行开始)

标签: matlab csv import


【解决方案1】:

鉴于您是如何解决的,我认为这是一个行尾字符问题。这有时会在基于 Windows 和 Unix 的系统之间移动文本文件时出现,因为它们使用不同的约定。

当您将%*[^\n] 添加到textscan 格式的末尾时,就像您在此处一样。这意味着将所有内容都跳过到行尾。但如果它需要一个特定的行尾字符,但找不到,它将跳过所有内容到 file 的末尾。这可以解释为什么您正确读取了一行,然后没有其他内容。

如果您不指定行尾字符是什么,Matlab 似乎默认为...某事...在帮助中这个不是很清楚的规范中:

默认的行尾顺序是 \n、\r 或 \r\n,具体取决于文件的内容。

无需创建新文件即可尝试解决此问题的一种方法是将'EndOfLine', '\r\n' 添加到您的textscan 调用中:

如果您指定 '\r\n',则 textscan 会处理 \r、\n 和 将两个 (\r\n) 组合为行尾字符。

这有望处理大多数标准(ish)EOL 约定。很可能使用与最初用于创建文件不同的软件进行复制粘贴和保存更改了行尾字符,以便 Matlab 能够识别它们。

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多