2015-05-14 2 views
0
[11/01/15 - 17:50] REFA,2,5,600, 
[11/01/15 - 17:52] REFB,1,3, 
[11/01/15 - 17:54] REFA,2,10,1200, 
[11/01/15 - 17:55] REFB,1,6, 

У меня есть текстовый файл из нескольких строк вышеуказанного формата. Как я могу начать читать текстовый файл из REFA и хранить только 2,5 600 в matlab?Чтение текстового файла из определенной строки далее в matlab

ответ

0

Вы можете легко сделать это с помощью регулярных выражений. Просто найдите все части строки, которые начинаются с [ и заканчиваются на ] и заменяют их нулевой строкой, или ''. Это можно сделать с помощью regexprep.

Таким образом, сначала прочитайте весь текстовый файл, затем устраните ненужные части. Предположим, что ваш текстовый файл находится в файле с именем text.txt, сделать что-то вроде этого:

fid = fopen('text.txt', 'r'); 
out = textscan(fid, '%s', 'delimiter', '\n'); 
out = regexprep(out{1}, '\s*\[.*\]\s*', ''); 

Первая строка кода открывает файл для чтения. Следующая часть читается в каждой строке вашего текста в массив ячеек, где вывод представляет собой массив вложенных ячеек в 1 элемент, но каждая ячейка внутри этого является отдельной строкой вашего текстового файла. Последняя строка обращается к этому единственному вложенному элементу и находит ту часть строки, где есть пустое пространство, существа с символом [, имеет кучу символов внутри, а затем заканчивается символом ] и снова немного белого пробела после этого. Мы находим эти части текста и заменяем их нулевой строкой. Это эффективно дает вам только ту часть текста, которую вы ищете.

Размещая пример текста в файле с именем text.txt, это то, что я получаю:

out = 

'REFA,2,5,600,' 
'REFB,1,3,' 
'REFA,2,10,1200,' 
'REFB,1,6,' 

Теперь, если вы просто хотите, чтобы получить только числовые значения, вы можете просто использовать индексацию:

out = cellfun(@(x) x(6:end-1), out, 'uni', 0); 

Теперь, чтобы получить эту работу с кодом (в комментариях), попробуйте следующее:

fileID = fopen('stack.txt'); 
D = textscan(fileID, '%s', 'delimiter', '\n'); 
fclose(fileID); 
D = regexprep(D{1}, '\s*\[.*\]\s*', ''); 
D = cellfun(@(x) x(6:end-1), D, 'uni', 0); 

%// Extract out the numbers now 
numbers = regexp(D, '(\d+)*', 'tokens'); 

%// Only look at lines that have three numbers 
idx = cellfun(@numel, numbers) == 3; 

%// Extract out just those lines 
numbers_extract = numbers(idx); 

%// Convert from string to numbers 
REFA.pkttype = cellfun(@(x) x(1), numbers_extract); 
REFA.datalength = cellfun(@(x) x(2), numbers_extract); 
REFA.ticks = cellfun(@(x) x(3), numbers_extract); 
+0

@ Yaant3y - я добавил больше кода, чтобы просто получить цифры. Надеюсь, это поможет! – rayryeng

+0

Спасибо @rayryeng, ваше решение избавляется от []. Но то, что я пытался сделать, это получить результат, полученный этим кодом. 'fileID = fopen ('stack.txt'); D = textscan (fileID, '% s% u8% u8% u16', 'Delimiter', ','); fclose (fileID); REFA.pkttype = D {2} (strcmp (D {1}, 'REFA')); REFA.datalength = D {3} (strcmp (D {1}, 'REFA')); REFA.ticks = D {4} (strcmp (D {1}, 'REFA')); ' Этот код работал, как только это было, когда я редактировал файл вручную как REFA, 2,5,600, REFB, 1,3, REFA, 2,10,1200, REFB, 1,6, перед тем, как получить помощь. Итак, как я могу объединить ваш код с этим, чтобы получить тот же результат? – Yaant3y

+0

@ Yaant3y - Попробуйте это и посмотрите, работает ли он – rayryeng

0

Вы можете начать поиск с запятой. Сохраните содержимое с первой запятой до последней запятой. Следующий код должен работать. Однако я не уверен в очень больших файлах.

readfin = fopen('myfile.txt','r'); 
lineno = 1; 
% Read every line one by one 
while(~feof(readfin)) 
    newline = fgets(readfin); 
    index = find(newline == ',',1,'first'); % find first comma 
    outdata = newline(index+1 : end-1);  % ignore first and last comma 
    disp(outdata);       % do whatever you need with your desired outdata here 
end 
Смежные вопросы