2013-07-09 2 views
1

Целью программы является просмотр файла для строки и выплевывание всех экземпляров этой строки с линией, в которой была строка.Поиск файла для строки и поместить его в массив

Я получил его для поиска по файлу и поискать его, просто не в состоянии получить их в массив или что-то, что позволяет мне хранить их все. Сейчас он дает мне последний экземпляр, я могу легко вставить один разрыв между строками 8 и 9, чтобы найти первый экземпляр.

Если кто знает, как хранить каждую строку с соответствующей строкой, это будет большой помощью.

fid = fopen('....... file directory....') 
prompt = 'What string are you searching for? '; 
str = input(prompt,'s'); 

i=0; 
for j=1:10000; 
tline = fgetl(fid);    %Returns next line of specified file 
counter = counter + 1;   %Counts the next line 
    if ischar(tline);   %Checks if the line is an array 
    U=strfind(tline,str);  %Sets U to be 1 if strfind finds the string in line tline 
     if isfinite(U) == 1      
      what = tline;  %This is where I want to set the array positions equal to whatever tline is at that time, then move onto the next i and search for the next tline. 
      i=i+1; 
     end    
    end 
end 
+0

Может ли быть более одного экземпляра на строку? – horchler

+0

Выяснил это. У меня есть массив, называемый «что», который показывает их. Но теперь мне нужно получить конкретные точки массива. Как строка будет «xdfsdfsd 00 1 2 3 5», и я хочу, чтобы вытащить 1 и 3. – Gbru

+0

еще одна вещь, которую я понимаю. Если бы у меня была строка, то строка (8) дала бы мне начальную позицию. Но у меня есть массив строк, так как бы я попал в определенную строку, а затем нашел его положение (также был бы набор, например, позиция 8-10). – Gbru

ответ

0

Вы можете хранить их в структуры массива, например:

lines = struct([]); % to store lines and line numbers  

idx = 1; 

fid = fopen('somefile.txt'); 

tline = fgets(fid); 

while ischar(tline) 

    U=strfind(tline, str); 

    if numel(U) > 0        

     lines(end + 1).line = tline; % save line 
     lines(end).lineNo = idx;  % save its number 
     lines(end).U = U;   % where is str in the just saved line    

    end 

    tline = fgets(fid); 

    idx = idx + 1; 

end 

fclose(fid); 

lineTxts = {lines(:).line}; % get lines in a cell 
lineNumbers = [lines(:).lineNo]; % get line numbers as matrix 
1

Я хотел бы предложить следующее:

haystack = 'test.txt'; 

prompt = 'What string are you searching for? '; 
needle = input(prompt, 's'); 

% MS Windows 
if ispc 

    output = regexp(evalc(['!find /N "' needle '" ' haystack]), char(10), 'split'); 

    output = regexp(output, '^\[([0-9].*)\]', 'tokens'); 
    output = cellfun(@(x)str2double(x{:}), output(~cellfun('isempty', output)))'; 

% OSX/Linux 
elseif isunix 

    output = regexp(evalc(['!grep -n "' needle '" ' haystack]), char(10), 'split'); 

    output = regexp(output, '^([0-9].*):', 'tokens');  
    output = cellfun(@(x)str2double(x{:}), output(~cellfun('isempty', output)))'; 

% Anything else: stay in MATLAB 
else 

    fid = fopen(haystack); 
    output = textscan(fid, '%s', 'delimiter', '\n'); 
    fclose(fid); 

    output = find(~cellfun('isempty', regexp(output{1}, needle))); 

end 

Содержание test.txt:

garbage garbage garbage 
garbage garbage garbage 
garbage garbage garbage 
garbage garbage garbage 
garbage garbage garbage 
garbage valuable garbage 
garbage garbage garbage 
garbage garbage valuable 
garbage garbage garbage 
garbage garbage garbage 
garbage garbage garbage 
garbage garbage garbage 
garbage valuable garbage 
garbage garbage garbage 
garbage garbage garbage 
garbage garbage garbage 

Когда Я выполняю код на W INDOWS или Linux или заставить версию MATLAB, с needle = 'valuable', я получаю правильные номера строк:

output = 
    6 
    8 
    13 

Преимущества использования ОС конкретных инструментов является то, что они имеют гораздо меньший объем памяти, чем чистые версии MATLAB (они не загружают весь файл в память). Даже если вы разработали код в MATLAB, чтобы предотвратить это (например, используя цикл с freadl), инструменты, специфичные для ОС, будут еще быть довольно быстрыми (и еще более дружественными к памяти); вот почему я положил его как окончательный вариант :)

Смежные вопросы