2010-02-11 10 views
4

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 

Répondre

4

Une méthode pour lire toutes les lignes d'un fichier ressemble:

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 

Cela suppose que toutes les lignes ont exactement le nombre de noms d'éléments de données, et vous savez ce que ce nombre est. Sinon, utilisez simplement file-read-line au lieu de file-read

+1

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. –