1

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

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
...

我想要三列:
timestamp;value1;value2

我尝试了此处描述的方法:
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',另一个是空的。

我还尝试根据我的情况调整这些问题的答案:
在 MATLAB 中导入数据和时间 在 matlab 中
读取具有特定格式的数据文件并将日期转换为 matal 序列时间
,但我没有成功。

如何导入该csv文件?

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

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

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

4

3 回答 3

0

试试呢:

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

对我来说,我得到:

a = 

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

因此,每个元素a对应于 csv 文件中的一列。这是你需要的吗?

谢谢!

于 2012-09-13T16:44:36.517 回答
0

看来你正在以正确的方式去做。您提供的示例在这里没有问题,我得到了您想要的输出。1x2 单元格中有什么?

如果我是你,我会用文件的较小子集再试一次,比如 10 行,看看输出是否改变。如果是,则尝试 100 行等,直到找到 4x1 单元 + 4x2 阵列分解为 1x2 单元的位置。可能是有一个空行或一个空字段或其他什么,这会强制textscan在额外的单元格级别中收集数据。

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

于 2012-09-13T17:36:23.333 回答
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];
于 2015-11-08T04:51:11.880 回答