2015-08-16 2 views
1

У меня есть файл с разделителями с разделителями на 9 столбцов, содержащий множество форматов данных. Однако некоторые записи пустые в пределах 'type'.Размещение пустых записей в TXT-файлах с помощью textscan - MATLAB

id id_2 s1  s2  st1  st2   type   desig num 
1 1 51371 51434 52858 52939 5:3_4:4_6:2_4:4_2:6 CO  1 
2 1 108814 108928 109735 110856 5:3_4:4_6:2_4:4_2:7 CO  2 
3 1 130975 131303 131303 132066 5:3_4:4_6:2_4:4_2:8 NCO 3 
4 1 191704 191755 194625 194803      NCO 4 
5 2 69355 69616 69901 70006      CO  5 
6 2 202580 202724 204536 205151 5:3_4:4_6:2_4:4  CO  6 

Благодаря смешанных типов форматов, Я использую TextScan импортировать эти данные:

data = textscan(fid1, '%*f %f %f %f %f %f %*s %s %*[^\r\n]','HeaderLines',1); 

Для того, чтобы столбцы 2-6, пропустить «type» и принять 8-ю колонну.

Этот подход терпит неудачу в строках с пустыми вводами - он пропускает это, как если бы это был не столбец, и вместо того, чтобы принимать «NCO» или «CO», это займет «4» или «5».

Есть ли способ предотвратить это? Я знаю, что могу изменить исходные .txt-файлы, чтобы включить что-то вроде «NA» для пустых записей, но это менее желательно, чем более надежный способ чтения таких файлов.

EDIT:

В дополнение к приведенному ниже ответ, просто указав разделитель, используемый, как представляется, решить проблему:

data = textscan(fid1, '%*f %f %f %f %f %f %*s %s %*[^\r\n]','HeaderLines',1,'delimiter','\t'); 
+0

Будут ли отсутствовать записи в столбце 'type' или могут отсутствовать записи из других столбцов? – Divakar

+0

Только столбец 'type'. – AnnaSchumann

ответ

1

Вот один подход с importdata и strsplit -

%// Read in data with importdata 
data = importdata('data1.txt') %// 'data1.txt' is the input text file 

%// Split data 
split_data = cellfun(@(x) strsplit(x,' '),data,'Uni',0) 

N = numel(split_data) %// number of rows in input textfile 

%// Setup output cell and mask arrays 
out_cell = cell(9,N) 
mask = true(9,N) 

%// Set the "type" entry as zero in mask array for the rows in textfile 
%// that has corresponding entry missing 
mask(7,cellfun(@length,split_data)~=9)=0 

%// Use mask to set cells in out_cell from split data entries 
out_cell(mask) = [split_data{:}] 
out = out_cell' 

Образец прогона -

>> type data1.txt 

id id_2 s1  s2  st1  st2   type   desig num 
1 1 51371 51434 52858 52939 5:3_4:4_6:2_4:4_2:6 CO  1 
2 1 108814 108928 109735 110856 5:3_4:4_6:2_4:4_2:7 CO  2 
3 1 130975 131303 131303 132066 5:3_4:4_6:2_4:4_2:8 NCO 3 
4 1 191704 191755 194625 194803      NCO 4 
5 2 69355 69616 69901 70006      CO  5 
6 2 202580 202724 204536 205151 5:3_4:4_6:2_4:4  CO  6 
>> out 
out = 
    'id' 'id_2' 's1'  's2'  'st1'  'st2'  'type'     'desig' 'num' 
    '1'  '1'  '51371'  '51434'  '52858'  '52939'  '5:3_4:4_6:2_4:4_2:6' 'CO'  '1' 
    '2'  '1'  '108814' '108928' '109735' '110856' '5:3_4:4_6:2_4:4_2:7' 'CO'  '2' 
    '3'  '1'  '130975' '131303' '131303' '132066' '5:3_4:4_6:2_4:4_2:8' 'NCO'  '3' 
    '4'  '1'  '191704' '191755' '194625' '194803'      [] 'NCO'  '4' 
    '5'  '2'  '69355'  '69616'  '69901'  '70006'      [] 'CO'  '5' 
    '6'  '2'  '202580' '202724' '204536' '205151' '5:3_4:4_6:2_4:4'  'CO'  '6' 
+0

Отличный подход! +1 – AnnaSchumann