2012-02-10 5 views
1

私は、音声認識プログラムのために転記されたいくつかの文の値の完全なセットを含むファイルを持っています。私はこのファイルを通って各文の値を抽出し、それらを新しい個々のファイルに書き込むためのいくつかのMATLABコードを書こうとしていました。だから、それらをすべて1つの 'mlf'ファイルに入れるのではなく、それぞれの文章のために別々のファイルに入れておきます。 「MLF」ファイル(すべての文章のすべての値が含まれている)ことにより、例えば新しいファイルにテキストを読み書きする - Matlab

は次のようになります:「」

#!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」とによって分離されています。私は、例えばN001用のファイルがちょうど含んでいるでしょう、すべてのNxxx.labのための新しいファイルを作成する必要があります:「」I「のNxxx.lab」とを指定するfgetlineを使用しようとしてきた

AH 
SEE 
I 
GOT 
THEM 
MONTHS 
AGO 

私は 'mlf'とは別の新しいファイルにコンテンツを書き込む方法がわからないので、うまくいきません。

誰かが私にどのような種類のアプローチを使用するかの指導をいただければ大いに感謝します!

乾杯!

+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のインデックスがパターンに基づいています。または、新しいファイルのエントリは2行目から始まり、ドットの後に続くと仮定します: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これで2つの問題が発生しました。http://blogs.msdn.com/b/oldnewthing/archive/2006/03/22/558007.aspx –

+0

非常に迅速に、非常にありがとう!しかし、それにはまだ '。'新しいファイルの最後の行に表示されます。私はあなたのコード内でどこが決定されるのか分かりません。 – FredBones

0

成長するセル配列を使用して情報を収集することができます。

ファイルから一度に1行ずつ読み込みます。

ファイル名を掴んで、最初の文章があれば最初の列に入れます。

行の読み取りがピリオドの場合は、文字列に追加し、インデックスを配列の行に移動します。新しいファイルに内容を書き込みます。

このコードは、セル配列を構築してその中に文字列を追加するのに役立ちます。私は行ごとに読むことは問題ではないと思います。また、文字列( '\ 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

関連する問題