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

Maí*_*újo 5 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
Run Code Online (Sandbox Code Playgroud)

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

Cha*_*les 5

代码看起来基本正确。我假设 csv 和 fileList 被定义为全局变量,否则每个上的“set”命令将生成编译时错误。我们还可以删除块中对 fileList 的引用,while因为一旦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
Run Code Online (Sandbox Code Playgroud)

当我在您提供的 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
Run Code Online (Sandbox Code Playgroud)


Ala*_*lan 5

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

现在让我们分析一下使用此代码解析文件时会发生什么.它将行作为字符串读入csv变量.它将$ x设置为20并将子字符串提取到逗号.使用read-from-string会将"1; 0; 0; 65; 0; 2; 45; 0; -0"视为在命令中心输入,因此您只需获取数字1,因为所有内容都来自第一个分号是评论.在1投入mylistcsv变量缩短到018961934.当读取它时,您会得到,18961934因为NetLogo忽略了前导0.

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