2012-02-10 2 views
1

У меня есть файл, который содержит полный набор значений для некоторых предложений, которые транслируются для программы распознавания речи. Ive пытался написать некоторый код matlab, чтобы просмотреть этот файл и извлечь значения для каждого предложения и записать их в новый отдельный файл. Поэтому вместо того, чтобы их всех в одном файле «mlf», я хочу, чтобы они были в отдельных файлах для каждого предложения.Чтение и запись текста в новый файл - Matlab

Например с помощью «MLF» файл (содержит все значения для всех предложений) выглядит следующим образом:

#!MLF!# 
"/N001.lab" 
AH 
SEE 
I 
GOT 
THEM 
MONTHS 
AGO 
. 
"/N002.lab" 
WELL 
WORK 
FOR 
LIVE 
WIRE 
BUT 
ERM 
. 
"/N003.lab" 
IM 
GOING 
TO 
SEE 
JAMES 
VINCENT 
MCMORROW 
. 
etc 

Таким образом, каждые предложения отделяются от «Nxxx.lab» и «». Мне нужно, чтобы создать новый файл для каждого Nxxx.lab, например, файл для N001 будет содержать только:

AH 
SEE 
I 
GOT 
THEM 
MONTHS 
AGO 

Я пытался использовать fgetline указать «Nxxx.lab» и «» границы, но это не работает, поскольку я не знаю, как записать содержимое в новый файл отдельно от «mlf».

Если кто-нибудь может дать мне какие-либо указания относительно того, какой подход к использованию будет очень благодарен!

Cheers!

+0

Почему бы вам не опубликовать свой код, чтобы люди могли исправить вас или внести предложения. – Ali

ответ

1

Попробуйте этот код (входной файл test.mlf должен находиться в рабочем каталоге):

%# read the file 
filename = 'test.mlf'; 
fid = fopen(filename,'r'); 
lines = textscan(fid,'%s','Delimiter','\n','HeaderLines',1); 
lines = lines{1}; 
fclose(fid); 

%# find start and stop indices 
istart = find(cellfun(@(x) strcmp(x(1),'"'), lines)); 
istop = find(strcmp(lines, '.')); 
assert(numel(istop)==numel(istop) && all(istop>istart),'Check the input file format.') 

%# write lines to new files 
for k = 1:numel(istart) 
    filenew = lines{istart(k)}(2:end-1); 
    fout = fopen(filenew,'wt'); 
    for l = (istart(k)+1):(istop(k)-1) 
     fprintf(fout,'%s\n',lines{l}); 
    end 
    fclose(fout); 
end 

код Предположим, что имена файлов в двойные кавычки, как в вашем примере. Если нет, вы можете найти базу индексов istart по шаблону. Или просто предположим, что записи для нового файла начинаются со второй строки и следуют за точкой: istart = [1; istop(1:end-1)+1];

-2

Хотя я уверен, что вы можете сделать это с помощью MATLAB, я бы предложил вам использовать Perl, чтобы разделить исходный файл, а затем обработать отдельные файлы с использованием MATLAB.

Следующий Perl скрипт читает весь файл («xxx.txt») и записывает отдельные файлы в соответствии с «в NAME.lab» линии:

open(my $fh, "<", "xxx.txt"); 

# read the entire file into $contents 
# This may not be a good idea if the file is huge. 
my $contents = do { local $/; <$fh> }; 

# iterate over the $contents string and extract the individual 
# files 
while($contents =~ /"(.*)"\n((.*\n)*?)\./mg) { 

    # We arrive here with $1 holding the filename 
    # and $2 the content up to the "." ending the section/sentence. 
    open(my $fout, ">", $1); 
    print $fout $2; 
    close($fout); 
} 

close($fh); 

многопоточный регулярное выражение немного трудно но он выполняет эту работу. Для такого рода манипуляции с текстом perl намного быстрее и полезно. Хороший инструмент, чтобы узнать, обрабатываете ли вы много текста.

+0

Matlab также делает REGEX http: //www.mathworks.com/help/techdoc/ref/regexp.html – ccook

+1

-1 Теперь у вас есть две проблемы: http://blogs.msdn.com/b/oldnewthing/archive/2006/03/22/558007.aspx –

+0

Это прекрасно работает и очень быстро, спасибо большое! Тем не менее, он по-прежнему включает в себя. в последней строке в новых файлах. Я новичок в perl, поэтому я не уверен, где в вашем коде это решение? – FredBones

0

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

Прочитайте одну строку за раз из файла.

Возьмите имя файла и поместите его в первый столбец, если его первый читается для предложения.

Если строка считается периодом, добавьте ее в строку и переместите индекс в строку в массиве. Напишите новый файл с контентом.

Этот бит кода должен помочь вам в создании массива ячеек при добавлении в него строки. Я предполагаю, что чтение строк за строкой не является проблемой. Вы также можете сохранить возврат каретки/новые строки внутри строки ('\ n').

%% Declare A 
A = {} 

%% Fill row 1 
A(1,1) = {'file1'} 
A(1,2) = {'Sentence 1'} 
A(1,2) = { strcat(A{1,2}, ', has been appended')} 

%% Fill row 2 
A(2,1) = {'file2'} 
A(2,2) = {'Sentence 2'} 
+0

Я намеренно не предоставил полный сценарий в духе учения. – ccook

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