我一直在NetLogo中运行游戏理论模拟,现在我有很多数据文件,包含交叉表数据 - 每列存储一个不同变量的值,并且有c。包含数据的1000行。我正在尝试编写一个程序来获取这些文件并计算每列的平均值。
只要每个文件中有一定数量的数据行,我就有一个可以工作的程序。该程序使用一个文件读取命令循环来计算运行总计,然后在读取所有行之后将其除以读取的行的nuber。
但是,我的真实数据文件具有可变数量的行。我一直在尝试使用file-at-end修改我的代码?让它在最后一行之后退出运行的总循环,但我无法找到任何使用它的方法 - 我只是得到一个错误,说文件已经结束。
有人可以建议一种解决方法吗?我已粘贴下面的工作代码。
-
globals [target-file-name
current-tally-file
lines-read
coops-fixed-run cheats-fixed-run either-fixed-run coop-freq-min-run
coop-freq-max-run coop-freq-mean-run ticks-run
num-lines
]
to setup
set target-file-name user-input "Type a name for the target file"
file-open target-file-name
file-print("TallyFile Reps pFixCoop pFixCheat pFixEither MeanMinCoop MeanMaxCoop MeanMeanCoop")
file-close
set num-lines read-from-string user-input "How many lines in the file to be processed?"
end
to go
set current-tally-file user-file
file-open current-tally-file
set lines-read 0
while [lines-read < num-lines][
let in1 file-read set coops-fixed-run (coops-fixed-run + in1)
let in2 file-read set cheats-fixed-run (cheats-fixed-run + in2)
let in3 file-read set either-fixed-run (either-fixed-run + in3)
let in4 file-read set coop-freq-min-run (coop-freq-min-run + in4)
let in5 file-read set coop-freq-max-run (coop-freq-max-run + in5)
let in6 file-read set coop-freq-mean-run (coop-freq-mean-run + in6)
let in7 file-read set ticks-run (ticks-run + in7)
set lines-read (lines-read + 1)
]
stop-and-clear
end
to stop-and-clear
let pfixcoop (coops-fixed-run / lines-read)
let pfixcheat (cheats-fixed-run / lines-read)
let pfixeither (either-fixed-run / lines-read)
let mean-of-mins (coop-freq-min-run / lines-read)
let mean-of-maxs (coop-freq-max-run / lines-read)
let mean-of-means (coop-freq-mean-run / lines-read)
let mean-of-ticks (ticks-run / lines-read)
file-open target-file-name
file-print (word current-tally-file " " lines-read " " pfixcoop " " pfixcheat "
" pfixeither " " mean-of-mins " " mean-of-maxs " " mean-of-means " "
mean-of-ticks)
file-close
set coops-fixed-run 0
set cheats-fixed-run 0
set either-fixed-run 0
set coop-freq-min-run 0
set coop-freq-max-run 0
set coop-freq-mean-run 0
set ticks-run 0
set lines-read 0
stop
end
答案 0 :(得分:4)
从文件中读取所有行的方法如下:
to read-file [filename]
file-open filename
while [not file-at-end?][
;read one line
let in1 file-read
let in2 file-read
;and so one, at the end you will probably want to put these into some global variable
set global-in1 fput in1 global-in1
]
file-close filename
end
这假设所有行都具有数据项的名称编号,并且您知道该数字是什么。否则只需使用file-read-line而不是file-read