Textscan - поймать ошибку и попробовать что-то еще

Я пытаюсь прочитать кучу текстовых файлов. Есть столбец даты. Формат в некоторых файлах для столбца даты — DD-MMM-YYYY, а в других — DD-MM-YYYY. У меня есть код, настроенный для чтения первого стиля. Но из-за этого, если он сталкивается со вторым типом, код останавливается, потому что он не может прочитать файл. Как я могу сделать что-то вроде If thetextscandoesn't work, try this second way?

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

person SugaKookie    schedule 27.02.2017    source источник


Ответы (1)


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.

person Adriaan    schedule 27.02.2017
comment
Спасибо. Это работает. Как я могу проверить формат столбца даты с предложением if/else, прежде чем я его прочитаю? - person SugaKookie; 27.02.2017
comment
@shizishan нельзя заранее. Я предлагаю прочитать только вторую строку, извлечь строку даты, а затем определить ее форму. Сохраните эту форму как строку, затем прочитайте весь файл в указанном формате. - person Adriaan; 27.02.2017
comment
Как определить форму строки даты, не глядя на нее самому? - person SugaKookie; 27.02.2017
comment
@shizishan проверьте шаблоны: 3 буквы -> должны быть MMM. 2 цифры, 2 цифры, 4 цифры -> либо dd-mm-yyyy, либо mm-dd-yyyy, поэтому проверьте, не превышает ли какое-либо из первых двух число 12, чтобы это исправить. Это слишком широкий вопрос, чтобы ответить здесь, поэтому сначала попробуйте сами, а если у вас возникнут проблемы, задайте новый вопрос. - person Adriaan; 27.02.2017