MATLAB / Octave - 如何使用包含逗号的数字和字符串解析CSV文件

时间:2017-10-20 03:27:46

标签: matlab csv octave textscan

我有一个包含20列的CSV文件。某些列具有数字值,其他列具有文本值,文本值可能包含也可能不包含逗号。

CSV内容示例:

column1, column2, column3, column4
"text value 1", 123, "text, with a comma", 25
"another, comma", 456, "other text", 78

我使用textscan功能,但我得到了最多的错误和奇怪的行为。对于一些参数,它只读取一列中的所有值,一些列表重复列,并且我尝试的大多数事情导致逗号被错误地解释为列分隔符(尽管文本用双引号括起来)。也就是说,我已经尝试过指定'分隔符'参数,也包括格式规范中的文字,但无济于事。

如上例所示,调用textscan处理CSV文件的正确方法是什么?我正在寻找一种既可以在MATLAB上运行也可以在Octave上运行的解决方案(或者,如果不可能的话,每个都有相同的解决方案)。

2 个答案:

答案 0 :(得分:4)

对于GNU Octave,使用io package

pkg load io
c = csv2cell ("jota.csv")

给出

c = 
{
  [1,1] = column1
  [2,1] = text value 1
  [3,1] = another, comma
  [1,2] =  column2
  [2,2] =  123
  [3,2] =  456
  [1,3] =  column3
  [2,3] =  text, with a comma
  [3,3] =  other text
  [1,4] =  column4
  [2,4] =  25
  [3,4] =  78
}
顺便提一下,你应该明确提一下解决方案是应该在GNU Octave,Matlab还是两者上运行

答案 1 :(得分:1)

首先,使用格式'%s'四次读取列标题:

fileID = fopen(filename);
C_text = textscan(fileID,'%s', 4,'Delimiter',',');

然后使用转换说明符%q来读取用双引号括起来的文本(“):

C = textscan(fileID,'%q %d %q %d','Delimiter',',');
fclose(fileID);

(这适用于在Octave上读取样本数据。它也适用于MATLAB。)

编辑:删除了多余的 fopen