读取带双引号和逗号分隔符的csv文件,包含双精度和字符串(任意行数和列数)

时间:2016-03-14 06:59:54

标签: matlab csv

我正在阅读具有以下格式的csv文件:

Header:,Date,Time,"MC2_Y241_TightnessPressValve","MC2_Y243_PressingValve""
Data,2015-09-16,15:41:52;781,"780.000000","0.0034"
Data,2015-09-16,15:41:52;791,"790.000000","0.1255"
Data,2015-09-16,15:41:52;801,"800.000000","1.5123"

Atm我正在使用fgetl(fid)查找标题以及所有日期和时间。然后我使用哪些行和列包含双精度的知识,以便能够使用csvread()进行快速阅读。但是,要使用csvread(),我必须先删除引号。我目前正在使用matlab中的powershell脚本执行此操作,但它太耗时,因为我需要读取+ 200Mb的文件。

注意:带有'%q'的文本扫描不能用于两个原因: 1)我希望立即将所有双打读取为双打(转换太耗时)。 2)文件包含不同数量的行和列。

这适用于独立应用程序。

我非常感谢所有的帮助,我花了无数个小时来提高效率。

1 个答案:

答案 0 :(得分:0)

我虽然应该发布一个答案,以防其他人有同样的问题。致Lee致谢我帮助我!

% Remove quotes
fid = fopen('temp.csv','w');
s = fileread('myFile.csv');
s = strrep(s,'"','');
fprintf(fid,s);
fclose(fid);

% Open new, quote free, file
fid = fopen('temp.csv','r');

% Get Headers
Headers{1} = fgetl(fid);
Headers = textscan(Headers{1},'%s','Delimiter',',');
Headers = Headers{1};
Headers = Headers(3:end);

% Get date and time
lineIndex = 1;
nextLine = fgetl(fid);
time{lineIndex} = nextLine(6:28);
lineIndex = lineIndex + 1;
nextLine = fgetl(fid);
while ~isequal(nextLine,-1) && ~isempty(nextLine)
    time{lineIndex} = nextLine(6:28);
    lineIndex = lineIndex + 1;
    nextLine = fgetl(fid);
end

% Get doubles
Data = csvread('temp.csv', 1,3);
fclose(fid);

% Convert time with datenum
Time = datenum(time,'yyyy-mm-dd,HH:MM:SS;FFF');

% Put all data in one matrix
Data = [Time, Data];