我在WINDOWS 7上有一个遗留的Matlab代码,我无法改变。
它读取格式为
的CSV输入文件SNo Date Qty
1 41640 100
2 41641 150
并做任何需要做的事。
但我有一个新版本的CSV文件,而不是格式:
SNo Date Qty
1 1/1/2013 100
2 1/2/2013 150
CSV文件非常庞大,因此无法通过在Excel中打开CSV文件将日期列更改为数字格式。所以,我正在考虑使用Matlab生成一个带有修改后的第二列的文件作为excel编号,并使其可用于遗留代码。
那么,我如何完成上述新CSV文件的生成,以便在遗留代码中可读。
答案 0 :(得分:1)
你可以,例如执行以下操作;
fin = fopen('csv_input.csv');
fout = fopen('csv_out.csv', 'w+');
offset = datenum([2013,1,1,0,0,0]) - 41640;
dvec = zeros(1,6);
while ~feof(fid)
l = fgetl(fidn);
% parse line by line
nums = sscanf(l, '%i %i/%i/%i %i')';
dvec(1:3) = nums([4,2,3]);
% convert to datenum using the calculated offset
date = datenum(dvec) - offset;
fprintf(fout, '%i %i %i\n', nums(1), date, nums(5));
end
fclose(fin);
fclose(fout);
免责声明:未经测试;)
答案 1 :(得分:1)
修改塞巴斯蒂安的回答“一下子”:
fin = fopen('csv_input.csv');
fout = fopen('csv_out.csv', 'w');
rawData = textscan(fin, "%d %i/%i/%i %i', Inf); % <<< read all at once
matlabDates = datenum(rawData(:,[4 3 2])); % <<< check that this works as expected
excelDates = m2xdate(matlabDates);
outputArray = [rawData[:,1] excelDates rawData(:,5)];
fprintf(fout, '%i %i %i\n", outputArray); % <<< check that this works as expected
fclose(fin);
fclose(fout);
我无法对此进行测试 - 因此请注意<<<
三行的结果,以确保格式符合预期(例如 - rawData
是否为单元格数组?)< / p>
这可能比塞巴斯蒂安的答案略高一些,但牺牲了将整个阵列同时放在内存中。