这些天我开始使用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” 帮助:/
答案 0 :(得分:5)
首先,CSV表示带有点小数分隔符的逗号分隔值,而不是带有逗号小数分隔符的分号分隔值。参见RFC 4180.尽管有些人出于民族主义原因拒绝了这一点,但科学界需要采用现有的标准。基于代理的建模是科学界的一部分。
现在让我们分析一下使用此代码解析文件时会发生什么。它将该行作为字符串读入您的csv
变量。它将$ x设置为20并将子字符串提取到逗号。使用read-from-string会将“1; 0; 0; 65; 0; 2; 45; 0; -0”视为已在命令中心输入,因此您只需获取数字{{1}因为从第一个分号开始的所有内容都是注释。 1
放入1
,mylist
变量缩短为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
希望这会有所帮助。 查尔斯