0

ID#_1、ID#_2、および ID#_3 の 3 つのオーディオ ファイルを含む複数のフォルダーがあるスクリプトがあります。ユーザーが異なる ID 番号の文字列を次々と入力すると、スクリプトは異なる ID を認識し、それぞれのコードを実行します。

このためにforループを設定しました-

form Settings comment Enter the IDs of the different subjects sentence subjectIDs endform

numOfSubjects = length(subjectIDs$)/4

for i from 0 to (numOfSubjects - 1)
    subjectID$ = mid$(subjectIDs$, 1 + 4*i, 4 + 4*i)
    outFile$ = subjectID$ + "/SubjectResponseOnsets" + subjectID$ + ".txt"
    path$ = subjectID$ + "/" + subjectID$
    @firstOutput
    @secondOutput
    @thirdOutput'

これらの各プロシージャは、コード内で事前に定義されており、基本的に、オーディオ ファイルから特定の範囲をテキスト ファイルに出力します。

1 つの ID が指定された場合、コードは正常に動作し、出力ファイルを正しく生成するように見えますが、一度に複数の ID で実行しようとすると、最初の ID のテキスト ファイルのみが出力されます。

for ループはうまく機能していないように見えますが、コードは最初の実行では正常に機能します。

どんな助けでも大歓迎です!

4

1 に答える 1

0

貼り付けたスニペットが不完全だったので、スクリプトが何をしようとしているのかをよく理解できたかどうかわかりません。そのまま実行可能なコードを提供するのが最善です。この場合、終了が欠落してendforおり、スニペットで定義されていない (プレースホルダーとしても) いくつかのプロシージャを呼び出していました。実行するためだけにダミーの手順を書かなければなりませんでした。

また、スクリプトがどのように失敗したかについても言及していないため、何を修正する必要があるかが不明でした。だから私はそれを機能させることに挑戦しました。

ID 分割コードが問題を引き起こしているようです。ID の入力を簡単にする CPrAN から入手できるプラグインからsplit手順を実行しました (完全な開示: 私はそのプラグインを書きました)。utils

form Settings
  comment Enter the IDs of the different subjects
  sentence subjectIDs 01 02 03
endform

@split: " ", subjectIDs$
numOfSubjects = split.length

for i to numOfSubjects
  subjectID$ = split.return$[i]
  path$ = subjectID$
  outFile$ = path$ + "/SubjectResponseOnsets" + subjectID$ + ".txt"

  # Make sure output directory exists
  createDirectory: path$

  @firstOutput
  @secondOutput
  @thirdOutput
endfor

procedure firstOutput ()
  appendFileLine: outFile$, "First"
endproc

procedure secondOutput ()
  appendFileLine: outFile$, "Second"
endproc

procedure thirdOutput ()
  appendFileLine: outFile$, "Third"
endproc

# split procedure from the utils CPrAN plugin
# http://cpran.net/plugins/utils
procedure split (.sep$, .str$)
  .seplen = length(.sep$)
  .length = 0
  repeat
    .strlen = length(.str$)
    .sep = index(.str$, .sep$)
    if .sep > 0
      .part$ = left$(.str$, .sep-1)
      .str$ = mid$(.str$, .sep+.seplen, .strlen)
    else
      .part$ = .str$
    endif
    .length = .length+1
    .return$[.length] = .part$
  until .sep = 0
endproc

これが問題ではない場合は、より具体的にする必要があります。

于 2015-04-03T23:59:34.617 に答える