【问题标题】:Read csv files with double quotes and comma delimiter, containing doubles and strings (arbitrary number of rows and columns)读取带有双引号和逗号分隔符的 csv 文件,包含双精度和字符串(任意行数和列数)
【发布时间】:2016-06-29 02:59:15
【问题描述】:

我正在阅读以下格式的 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' 的 textscan 有两个原因: 1)我希望所有双打立即被读取为双打(转换太耗时)。 2) 文件包含不同数量的行和列。

这是一个独立的应用程序。

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

【问题讨论】:

  • 各种行数和列数?可以有任意数量的行。但您需要知道列的格式。
  • 我可以使用 fgetl 并检查字符串中的分隔符(逗号)的数量并找出我有多少列。但是我该去哪里呢?
  • 读取标题行f = fopen(file,'r'); h = f.getl(f);,用分隔符cols = regexp(h, ',', 'split');分割,然后你会得到一个包含每列名称的单元格字符串数组。你可以通过ncol = length(cols);知道列的数量从cols的每一项的值,你可以知道这个列是什么以及数据类型。然后你可以根据它构造一个格式字符串。
  • 读入字符串s = fileread(you_file);,然后使用textscan(s, format)。如果引用有问题,请使用s = strrep(s,'"','') 删除引号。
  • 阅读textscan的帮助文档,尤其是formatSpec部分

标签: matlab csv


【解决方案1】:

虽然我应该发布一个答案,以防其他人有同样的问题。感谢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];

【讨论】:

    猜你喜欢
    • 2016-04-15
    • 1970-01-01
    • 2014-03-14
    • 2016-06-08
    • 2018-03-20
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多