2017-02-27 31 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