【问题标题】:Handling very large matlab file处理非常大的matlab文件
【发布时间】:2023-03-25 17:36:01
【问题描述】:

我在 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 文件以读取到旧代码中。

【问题讨论】:

  • Windows 7(刚刚也将其添加到问题中)
  • 日期转换是问题还是读取/写入 csv 文件?
  • 我不知道如何在 excel 中对如此庞大的文件进行日期转换,也不知道读取旧 CSV 文件和创建新 CSV 文件的有效方法。你的建议是一个很好的解决方案。 :)
  • 使用datenum进行转换。
  • datenum 究竟对我的情况有何帮助?我的问题不是,不知道 datenum 是什么。

标签: matlab


【解决方案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);

我无法对此进行测试 - 因此请注意带有 &lt;&lt;&lt; 的三行的结果,以确保格式符合预期(例如 - rawData 是单元格数组吗?)

这可能比 Sebastian 的回答更有效,但代价是一次性将整个数组存储在内存中。

【讨论】:

    【解决方案2】:

    你可以例如执行以下操作;

    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);
    

    免责声明:未经测试;)

    【讨论】:

    • 你不是说date = datenum(datenum([2013,1,1,0,0,0])) - offset;吧?我猜你想要 date = datenum(datenum([dvec 0 0 0])) - offset; 。相同的免责声明!
    • 我将使用 m2xdate(datenum('1/1/2014')) 因为我需要日期为 excel 数字格式。这里没有偏移量。
    • 我不知道m2xdate 来自哪里的财务工具箱。但如果它已经存在,它肯定比我的版本测试得更好。虽然为了完整性 - 除了减去偏移量之外它不会做任何其他事情。只有偏移量的来源不同。
    • 我想避免逐行解析,但似乎这是唯一的出路?
    • 您可以将上述内容从使用fgetlsscanf修改为使用fscanf(查看文档)。这将扫描整个文件并将所有解析的数字返回到nums。由于您将 csv 文件称为“大量”,因此这可能会成为内存方面的问题 - 因为您将一次将所有 csv 数据存储在内存中。这真的取决于“大量”在字节方面的含义......
    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    相关资源
    最近更新 更多