0

split01.txt、split02.txtなどの名前の複数のテキストファイルがあり、以下の形式のデータが含まれています:(これが私が持っているものです)

/tmp/audio_files/n000001.wav;
/tmp/audio_files/n000002.wav;
/tmp/audio_files/n000003.wav;
/tmp/audio_files/p000004.wav;
/tmp/audio_files/p000005.wav;

split01.txt、split02.txtなどのファイルから取得したデータを以下の形式で別のファイルを作成したいと思います:(これは私が見たい形式です)

[playlist]
NumberOfEntries=5

File000001=n000001.wav
Title000001=n000001.wav

File000002=n000002.wav
Title000002=n000002.wav

File000003=n000003.wav
Title000003=n000003.wav

File000004=p000004.wav
Title000004=p000004.wav

File000005=p000005.wav
Title000005=p000005.wav

Version=2

これは1つのインスタンスで実行できますか?私が尋ねる理由は、最初のプロセスがオーディオファイルの作成を完了した後、octave / matlab内からコマンド(awk、grep、sedなど)を実行/呼び出すためです。

例:以下の1つの例で私が意味するもの:( matlab / octaveコード)

  system(strcat({'split --lines=3600 -d '},dirpathwaveformstmp,fileallplaylistStr,{' '},dirpathwaveformstmp,'allsplit'))

これにより、1つのファイルがallsplit01 allsplit02などの名前の複数のファイルに分割され、各ファイルの最大行数は3600行になります。

これを尋ねた人のために、私がオクターブ/MATLABで作成するオーディオファイルのプレイリストファイルを作成しています。

助言がありますか?

4

2 に答える 2

1

Octaveでプログラムを書いているのなら、Octaveでもやってみませんか?言語は数値解析に限定されません。あなたがやろうとしていることは、オクターブ関数を使って非常に簡単に行うことができます。

filepath     = "path for input file"
playlistpath = "path for output file" 
## read file and prepare cell array for printing
files = strsplit (fileread (filepath)', "\n");
if (isempty (files{end}))
  files(end) = [];
endif
[~, names, exts] = cellfun (@fileparts, files, "UniformOutput", false);
files = strcat (names, exts);
files(2,:) = files(1,:);
files(4,:) = files(1,:);
files(1,:) = num2cell (1:columns(files))(:);
files(3,:) = num2cell (1:columns(files))(:);

## write playlist
[fid, msg] = fopen (playlistpath, "w");
if (fid < 0)
  error ("Unable to fopen %s for writing: %s", playlistpath, msg);
endif
fprintf (fid, "[playlist]\n");
fprintf (fid, "NumberOfEntries=%i\n", columns (files));
fprintf (fid, "\n");
fprintf (fid, "File%06d=%s\nTitle%06d=%s\n\n", files{:});
fprintf (fid, "Version 2");

if (fclose (fid))
  error ("Unable to fclose file %s with FID %i", playlistpath, fid);
endif
于 2013-02-23T12:41:47.400 に答える
1

これがawkでそれを行うことができる1つの方法です:

parse.awk

BEGIN {
  print "[playlist]"
  print "NumberOfEntries=" len "\n"
  i = 1
}

{
  gsub(".*/|;", "")
  printf "File%06d=%s\n" , i, $0
  printf "Title%06d=%s\n\n", i, $0
  i++
}

END {
  print "Version 2"
}

次のように実行します。

awk -v len=$(wc -l < infile) -f parse.awk infile

出力:

[playlist]
NumberOfEntries=5

File000001=n000001.wav
Title000001=n000001.wav

File000002=n000002.wav
Title000002=n000002.wav

File000003=n000003.wav
Title000003=n000003.wav

File000004=p000004.wav
Title000004=p000004.wav

File000005=p000005.wav
Title000005=p000005.wav

Version 2
于 2013-02-22T12:36:12.927 に答える