我有一个大型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