Octave / MatLab:根据列匹配条件从CSV文件导入行

时间:2015-01-07 17:51:02

标签: matlab csv file-io octave

我有一个大型CSV文件,其中的客户数据都是数字格式,我的程序以:

开头
customerData = csvread('CTData.csv');

但是,该文件到目前为止太大了,我的32位版本的Octave for Windows无法直接加载;而且,它太大而无法手动修改,因此所有数据都是数字。

因此,我不想直接加载文件,而是首先创建一个新文件 CTData6mo.csv ,它提取一个格式正确的6个月数据子集。

CSV文件的格式为:

Business Unit | Date | Customer ID | data 1 | ... | data 19 | Description

其中数据j j = 1,2,...,19 )是您感兴趣的客户数据。

业务单位描述条目的格式是字符串,我希望它们在新的导入文件中删除,以便第1列= 日期的。日期格式为短日期: mm / dd / yyyy

我想创建两个变量 beginDate endDate ,这些变量对应于感兴趣的六个月时间段的开始和结束,并想象一下-line检查第k行的日期(第2列)是否在所需范围内;如果是,则将该行写入删除了第一(1)和最后(23)列的新导入文件。

我对Octave的文件I / O方法或处理日期的方法并不是特别熟悉,因此非常感谢实施上段所述方法或提供更有效实施的一些指导。

谢谢!


修改

这是我提出的实施方案:

dBegin = datenum('12/01/2013');
dEnd = datenum('05/30/2014');
fName1 = 'CT_no_weekends.csv';
fName2 = 'CTData.csv';
fID1 = fopen(fName1, 'r');
fID2 = fopen(fName2, 'w');
fprintf(fID2, '%s', strjoin(strtok(strsplit(fgetl(fID1), ','), '"'), ','));
while ~feof(fID1)
  csvLineString = fgetl(fID1);
  csvLineArray = strtok(strsplit(csvLineString, ','), '"');
  csvLineArray{2} = datenum(csvLineArray{2}, 'yyyy-mm-dd');
  if (csvLineArray{2} <= dEnd && csvLineArray{2} >= dBegin)
    csvLineArray(:, length(csvLineArray)) = [];
    csvLineArray(:, 1) = [];
    fpritnf(fID2, '%s', strjoin(cellfun(@num2str, csvLineArray, 'UniformOutput', 0), ','));
  endif
endwhile

0 个答案:

没有答案