J'ai des simulations de la théorie des jeux dans NetLogo et j'ai maintenant des fichiers de données lots, contenant des données croisées - chaque colonne stocke une valeur d'une variable différente, et il y a c. 1000 lignes contenant les données. J'essaye d'écrire un programme qui prendra ces dossiers et calculera la valeur moyenne pour chaque colonne.NetLogo: la lecture des données à partir des fichiers d'entrée avec un nombre variable de lignes
J'ai un programme qui fonctionne aussi longtemps que il y a un nombre constant de lignes de données dans chaque fichier. Le programme utilise une boucle de commandes de lecture de fichiers pour calculer les totaux cumulés, qui sont ensuite divisés par le nombre de lignes lues une fois que toutes les lignes ont été lues. Cependant, mes fichiers de données réels ont des nombres de lignes variables. J'ai essayé de modifier mon code en utilisant file-at-end? pour le faire sortir de la boucle du total courant après la dernière ligne, mais je n'ai pas réussi à trouver un moyen de l'employer qui fonctionne - j'obtiens juste une erreur disant que le dossier est à la fin.
S'il vous plaît quelqu'un pourrait suggérer une façon de faire face à cela? J'ai collé le code de travail ci-dessous.
-
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
Merci beaucoup! Je n'avais pas réalisé que je ne pouvais pas utiliser le fichier à la fin. J'ai effectivement un certain nombre d'éléments de données par ligne, donc cela semble parfait. –