我有一个包含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上运行的解决方案(或者,如果不可能的话,每个都有相同的解决方案)。
答案 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 。