处理非常大的matlab文件

时间:2013-11-26 13:38:25

标签: matlab

我在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文件的生成,以便在遗留代码中可读。

2 个答案:

答案 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>

这可能比塞巴斯蒂安的答案略高一些,但牺牲了将整个阵列同时放在内存中。