Чтение и запись текста в новый файл - Matlab - PullRequest
1 голос
/ 10 февраля 2012

У меня есть файл, который содержит полный набор значений для некоторых предложений, которые были расшифрованы для программы распознавания речи. Я пытался написать код matlab, чтобы пройти через этот файл, извлечь значения для каждого предложения и записать их в новый отдельный файл. Поэтому вместо того, чтобы хранить их все в одном файле 'mlf', я хочу, чтобы они были в отдельных файлах для каждого предложения.

Например, файл '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».

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

Ура! * * 1013

Ответы [ 3 ]

1 голос
/ 10 февраля 2012

Попробуйте этот код (входной файл 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 индексов на основе шаблона.Или просто предполагая, что записи для нового файла начинаются со 2-й строки и следуют за точкой: istart = [1; istop(1:end-1)+1];

0 голосов
/ 10 февраля 2012

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

Чтение одной строки за раз из файла.

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

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

Этот фрагмент кода должен помочь вам в создании массива ячеек при добавлении в него строки.Я предполагаю, что чтение построчно не является проблемой.Вы также можете сохранить возврат каретки / новые строки в строке ('\ 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 голосов
/ 10 февраля 2012

Хотя я уверен, что вы можете сделать это с 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 гораздо быстрее и полезнее. Хороший инструмент для изучения, если вы обрабатываете много текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...