如何使用netlogo读取.CSV文件?

时间:2014-11-24 02:18:34

标签: csv netlogo

这些天我开始使用netlogo,所以我遇到了一些我没有找到解决问题的问题。     我必须阅读一个巨大的.csv文件,在网上获取此代码:

to openFile
file-open "testeCsv.csv"
set csv file-read-line
set csv word csv ","  ; add comma for loop termination 

let mylist []  ; list of values 
  while [not empty? csv] 
  [
    let $x position "," csv 
    let $item substring csv 0 $x  ; extract item 
    carefully [set $item read-from-string $item][] ; convert if number 
    set mylist lput $item mylist  ; append to list 
    set csv substring csv ($x + 1) length csv  ; remove item and comma 
    set fileList mylist
  ] 
  set fileList mylist
  show fileList
end

此文件包含以下行:“1; 0; 0; 65; 0; 2; 45; 0; -0,018961934” 此代码的输出是:“1 18961934” 帮助:/

2 个答案:

答案 0 :(得分:5)

首先,CSV表示带有点小数分隔符的逗号分隔值,而不是带有逗号小数分隔符的分号分隔值。参见RFC 4180.尽管有些人出于民族主义原因拒绝了这一点,但科学界需要采用现有的标准。基于代理的建模是科学界的一部分。

现在让我们分析一下使用此代码解析文件时会发生什么。它将该行作为字符串读入您的csv变量。它将$ x设置为20并将子字符串提取到逗号。使用read-from-string会将“1; 0; 0; 65; 0; 2; 45; 0; -0”视为已在命令中心输入,因此您只需获取数字{{1}因为从第一个分号开始的所有内容都是注释。 1放入1mylist变量缩短为csv。读取此内容后,您将获得018961934,因为NetLogo会忽略前导18961934

这一切都是因为您没有真正的CSV文件。因此,如果要使用此代码进行解析,则需要使用真实的CSV文件。

答案 1 :(得分:4)

代码似乎基本正确。我假设csv和fileList被定义为全局变量,否则" set"每个命令都会产生编译时错误。我们也可以删除while块中对fileList的引用,因为一旦while循环退出,它仍会被重置。然后,如果您想将分号保留为分隔符,我们也可以进行更改。总而言之,我们得到:

globals [csv fileList]

to openFile
file-open "testeCsv.csv"
set csv file-read-line
set csv word csv ";"  ; add semicolon for loop termination 

let mylist []  ; list of values 
  while [not empty? csv] 
  [
    let $x position ";" csv 
    let $item substring csv 0 $x  ; extract item 
    carefully [set $item read-from-string $item][] ; convert if number 
    set mylist lput $item mylist  ; append to list 
    set csv substring csv ($x + 1) length csv  ; remove item and comma 
  ] 
  set fileList mylist
  show fileList
end

当我在您提供的CSV文件中的行上运行时(将文件中的小数点分隔符转换为","到"。")我得到结果你寻求,[1 0 0 65 0 2 45 0 -0.018961934]。

当然,只读取文件中的一行。我假设您将要遍历文件中的每一行,在读取时存储或使用每一行。以下内容将每行存储在列表列表中。

globals[csv fileList]

to openFile
  file-open "testeCsv.csv"
  set fileList []

  while [not file-at-end?] [
    set csv file-read-line
    set csv word csv ";"  ; add comma for loop termination 

    let mylist []  ; list of values 
    while [not empty? csv] 
    [
      let $x position ";" csv 
      let $item substring csv 0 $x  ; extract item 
      carefully [set $item read-from-string $item][] ; convert if number 
      set mylist lput $item mylist  ; append to list 
      set csv substring csv ($x + 1) length csv  ; remove item and comma 
    ] 
    set fileList lput mylist fileList
  ]

  show fileList
  file-close
end

希望这会有所帮助。 查尔斯