Matlab 使用混合类型数据读取CSV

Matlab 使用混合类型数据读取CSV,matlab,csv,import,Matlab,Csv,Import,我需要在MATLAB中阅读以下csv文件: 2009-04-29 01:01:42.000;16271.1;16271.1 2009-04-29 02:01:42.000;2.5;16273.6 2009-04-29 03:01:42.000;2.599609;16276.2 2009-04-29 04:01:42.000;2.5;16278.7 ... 我想有三个专栏: 时间戳;价值1;价值2 我尝试了这里描述的方法: 修改为: filename = 'prova.csv'; fid

我需要在MATLAB中阅读以下
csv
文件:

2009-04-29 01:01:42.000;16271.1;16271.1
2009-04-29 02:01:42.000;2.5;16273.6
2009-04-29 03:01:42.000;2.599609;16276.2
2009-04-29 04:01:42.000;2.5;16278.7
...
我想有三个专栏:
时间戳;价值1;价值2

我尝试了这里描述的方法:

修改为:

filename = 'prova.csv';  
fid = fopen(filename, 'rt');  
a = textscan(fid, '%s %f %f', ...  
        'Delimiter',';', 'CollectOutput',1);  
fclose(fid);
但它返回一个1x2单元,其第一个元素是
a{1}='ÿþ2'
,另一个是空的

我还试图根据我的情况调整这些问题的答案:


但我没有成功

如何导入该
csv
文件

编辑在回答@macduff之后,我尝试将上面报告的数据复制粘贴到新文件中,并使用:

a = textscan(fid, '%s %f %f','Delimiter',';');  
它是有效的。 不幸的是,这并没有解决问题,因为我必须处理自动生成的
csv
文件,这似乎是导致MATLAB异常行为的原因。

试试看:

a = textscan(fid, '%s %f %f','Delimiter',';');
对我来说,我得到:

a = 

{4x1 cell}    [4x1 double]    [4x1 double]
因此,
a
的每个元素对应于csv文件中的一列。这是你需要的吗


谢谢

看来你的做法是对的。您提供的示例在这里没有问题,我得到了您想要的输出。1x2单元里有什么

如果我是你,我会用一个较小的文件子集再试一次,比如说10行,看看输出是否会改变。如果是,则尝试100行,以此类推,直到找到4x1单元+4x2阵列分解为1x2单元的位置。这可能是因为有一个空行或一个空字段或其他任何内容,迫使
textscan
在附加级别的单元格中收集数据


请注意,
'CollectOutput',1
将最后两列收集到一个数组中,因此您将得到一个包含字符串的4x1单元格数组,以及一个包含双精度的4x2单元格数组。这真的是你想要的吗?否则,请参阅@macduff的帖子

我不得不解析像这样的大文件,我发现我不喜欢这个工作的文本扫描。我只使用一个基本的while循环来解析文件,并使用datevec将时间戳组件提取到一个6元素的时间向量中

%% Optional: initialize for speed if you have large files
n = 1000  %% <# of rows in file - if known>
timestamp = zeros(n,6);
value1 = zeros(n,1);
value2 = zeros(n,1);

fid = fopen(fname, 'rt');
if fid < 0
    error('Error opening file %s\n', fname); % exit point
end

cntr = 0
while true
    tline = fgetl(fid);  %% get one line
    if ~ischar(tline), break; end; % break out of loop at end of file
    cntr = cntr + 1;

    splitLine = strsplit(tline, ';');  %% split the line on ; delimiters
    timestamp(cntr,:) = datevec(splitLine{1}, 'yyyy-mm-dd HH:MM:SS.FFF'); %% using datevec to parse time gives you a standard timestamp vector
    value1(cntr) = splitLine{2};
    value2(cntr) = splitLine{3};
 end

%% Concatenate at the end if you like
result = [timestamp  value1  value2];
%%可选:如果文件较大,则初始化以提高速度
n=1000%
时间戳=零(n,6);
值1=零(n,1);
值2=零(n,1);
fid=fopen(fname,'rt');
如果fid<0
错误('打开文件%s\n',fname时出错);%出口点
结束
cntr=0
虽然是真的
tline=fgetl(fid);%接一条线
如果~ischar(t线),则断开;结束;%在文件末尾中断循环
cntr=cntr+1;
splitLine=strsplit(tline,;);%把线分开;分隔符
时间戳(cntr,:)=datevec(分割线{1},'yyyy-mm-dd-HH:mm:SS.FFF');%使用datevec解析时间为您提供了一个标准的时间戳向量
值1(cntr)=分割线{2};
值2(cntr)=分割线{3};
结束
%%如果愿意,请在末尾连接
结果=[时间戳值1值2];

谢谢你的回答,但是从你的代码中我得到了:
a={1x1 cell}[0x1 double][0x1 double]
谢谢你的回答。单元格的第一个元素是
a{1}='ÿþ2'
其他元素都是空的…我试图向原始文件中添加更多数据(10行,50100…),但没有任何变化…如果我将整个数据集(约20000行)复制粘贴到另一个
csv
中,它工作得很好也许是因为某种原因,Matlab在第一行阻塞了?您是否对生成的文件和使用复制粘贴制作的文件进行了区分?你能通过编程从Matlab中复制/粘贴并使其工作吗?