2012-09-13 87 views
1

我需要阅读下列csv文件在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

我试过办法这里描述:
Reading date and time from CSV file in MATLAB
修改为:

filename = 'prova.csv'; 
fid = fopen(filename, 'rt'); 
a = textscan(fid, '%s %f %f', ... 
     'Delimiter',';', 'CollectOutput',1); 
fclose(fid); 

但它回退了1x2单元格,其第一个元素是a{1}='ÿþ2',另一个是空的。

我也试图解答适应我的情况下,对这些问题:
importing data with time in MATLAB
Read data files with specific format in matlab and convert date to matal serial time
但我没有成功。

如何导入csv文件?

编辑 @macduff的答案后,我试图复制粘贴在一个新的文件上面报道的数据和使用:

a = textscan(fid, '%s %f %f','Delimiter',';'); 

和它的作品。 不幸的是,没有解决问题,因为我不得不处理csv文件自动生成,这似乎是奇怪的MATLAB行为的原因。

+1

也许Matlab出于某种原因在第一行上窒息?您是否对生成的文件和使用复制粘贴进行了区别?你可以从Matlab复制/粘贴编程并使其工作吗? – Superbest

回答

0

关于尝试什么:

a = textscan(fid, '%s %f %f','Delimiter',';'); 

对于我来说,我得到:

a = 

{4x1 cell} [4x1 double] [4x1 double] 

这样的a每个元素对应于您的CSV文件列。这是你需要的吗?

谢谢!

+0

感谢您的回答,但从您的代码我得到:'a = {1x1 cell} [0x1 double] [0x1 double]' – Iovem

0

似乎你正在以正确的方式前进。你提供的例子在这里没有问题,我得到你想要的输出。什么是1x2单元格?

如果我是你,我会再次尝试使用该文件的较小子集,比如说10行,然后查看输出是否更改。如果是,则尝试100行等,直到找到4x1单元+ 4x2阵列分解成1x2单元的位置。可能是空行或单个空字段或其他,这会强制textscan收集更多级别单元中的数据。

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

+0

感谢您的答案。单元格的第一个元素是'a {1} ='ÿþ2',其他元素是空的....我尝试将更多数据添加到原始文件(10行,50,100 ...),但没有任何更改... 。如果我将另一个'csv'中的整个数据集(约2万行)复制粘贴完美 – Iovem

0

我不得不解析这样的大文件,我发现我不喜欢这个工作的textscan。我只是使用一个基本的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];