2017-02-27 32 views
0

我想读一堆文本文件。有一个日期栏。日期列的某些文件中的格式为DD-MMM-YYYY,而在其他文件中的格式为DD-MM-YYYY。我已经设置了代码来读取第一个样式。但是因为如此,如果它运行到第二种类型,代码会停止,因为它无法读取文件。我该怎么做,If the textscan doesn't work, try this second wayTextscan - 抓取错误,并尝试其他的东西

for n = 1:length(data1{id}) 
    fname1 = char(data1{id}(n)); 
    delimiter = '\t'; 
    startRow = 2; 
    formatSpec = '%s%f%f%f%s%s%s%s%{dd-MMM-yyyy}D%s%s%f%f%f%f%f%f%s%s%s%s%s%s%s%s%f%f%[^\n\r]'; 
    fileID = fopen(fname1,'r'); 
    dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'EmptyValue' ,NaN,'HeaderLines' ,startRow-1, 'ReturnOnError', false, 'EndOfLine', '\r\n'); 
    fclose(fileID); % Close the text file. 
    PM25_1{id}{n} = table(dataArray{1:end-1}, 'VariableNames', {'MonitorID','POC','Latitude','Longitude','Datum','ParameterName','SampleDuration','PollutantStandard','DateLocal','UnitsofMeasure','EventType','ObservationCount','ObservationPercent','ArithmeticMean','FirstMaxValue','FirstMaxHour','AQI','MethodName','LocalSiteName','Address','StateName','CountyName','CityName','CBSAName','DateofLastChange','DateNum','NumberOfPOCs'}); 
    clearvars filename delimiter startRow formatSpec fileID dataArray ans; 
end 

回答

2
try 

for n = 1:length(data1{id}) 
    fname1 = char(data1{id}(n)); 
    delimiter = '\t'; 
    startRow = 2; 
    formatSpec = '%s%f%f%f%s%s%s%s%{dd-MMM-yyyy}D%s%s%f%f%f%f%f%f%s%s%s%s%s%s%s%s%f%f%[^\n\r]'; 
    fileID = fopen(fname1,'r'); 
    dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'EmptyValue' ,NaN,'HeaderLines' ,startRow-1, 'ReturnOnError', false, 'EndOfLine', '\r\n'); 
    fclose(fileID); % Close the text file. 
    PM25_1{id}{n} = table(dataArray{1:end-1}, 'VariableNames', {'MonitorID','POC','Latitude','Longitude','Datum','ParameterName','SampleDuration','PollutantStandard','DateLocal','UnitsofMeasure','EventType','ObservationCount','ObservationPercent','ArithmeticMean','FirstMaxValue','FirstMaxHour','AQI','MethodName','LocalSiteName','Address','StateName','CountyName','CityName','CBSAName','DateofLastChange','DateNum','NumberOfPOCs'}); 
    clearvars filename delimiter startRow formatSpec fileID dataArray ans; 
end 

catch 

for n = 1:length(data1{id}) 
    fname1 = char(data1{id}(n)); 
    delimiter = '\t'; 
    startRow = 2; 
    formatSpec = '%s%f%f%f%s%s%s%s%{dd-MM-yyyy}D%s%s%f%f%f%f%f%f%s%s%s%s%s%s%s%s%f%f%[^\n\r]'; 
    fileID = fopen(fname1,'r'); 
    dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'EmptyValue' ,NaN,'HeaderLines' ,startRow-1, 'ReturnOnError', false, 'EndOfLine', '\r\n'); 
    fclose(fileID); % Close the text file. 
    PM25_1{id}{n} = table(dataArray{1:end-1}, 'VariableNames', {'MonitorID','POC','Latitude','Longitude','Datum','ParameterName','SampleDuration','PollutantStandard','DateLocal','UnitsofMeasure','EventType','ObservationCount','ObservationPercent','ArithmeticMean','FirstMaxValue','FirstMaxHour','AQI','MethodName','LocalSiteName','Address','StateName','CountyName','CityName','CBSAName','DateofLastChange','DateNum','NumberOfPOCs'}); 
    clearvars filename delimiter startRow formatSpec fileID dataArray ans; 
end 

end 

裹一切都在一个try/catch块。如果第一个样式失败,请尝试下一个样式(请注意,我更改了catch部分中的日期格式。)如果您有更多可能性,则需要使用if/else子句等方式检查每种样式。

+0

谢谢。这工作。在读取日期之前,如何使用'if/else'子句检查日期列的格式? – shizishan

+0

@shizishan你不能预先。我建议只阅读第二行,提取日期字符串,然后确定其形式。将该表单保存为字符串,然后使用指定的格式读取整个文件。 – Adriaan

+0

如何确定日期字符串的形式而不必自己查看? – shizishan