这些天我开始使用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"帮助:/
代码看起来基本正确。我假设 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)
首先,CSV表示逗号分隔值,带点小数分隔符,而不是带有逗号小数分隔符的分号分隔值.参见RFC 4180.尽管有些人出于民族主义原因拒绝了这一点,但科学界需要采用现有的标准.基于代理的建模是科学界的一部分.
现在让我们分析一下使用此代码解析文件时会发生什么.它将行作为字符串读入csv变量.它将$ x设置为20并将子字符串提取到逗号.使用read-from-string会将"1; 0; 0; 65; 0; 2; 45; 0; -0"视为在命令中心输入,因此您只需获取数字1,因为所有内容都来自第一个分号是评论.在1投入mylist和csv变量缩短到018961934.当读取它时,您会得到,18961934因为NetLogo忽略了前导0.
这一切都发生是因为您没有真正的CSV文件.因此,如果要使用此代码进行解析,则需要使用真实的CSV文件.
| 归档时间: |
|
| 查看次数: |
2465 次 |
| 最近记录: |