我有一个用Excel编写的文件,它包含文本和数字,例如第1行将包含MyAge 20 MyYear 1994.我将其保存为.txt(文本制表符分隔)文件并尝试将其读入Netlogo。当我在记事本中打开文件时,数字显示为数字,文本显示为“”。 Netlogo不会读取文件说“期望一个常数”。如果我删除文本或用引号手动包围文本,那么它工作正常。所以,如果我的专栏写着:“MyAge”20“MyYear”1994,那么它就是ifne。
对于小型数据集来说,这将是繁琐的,并且大型数据集几乎不可能手动将“”添加到所有字符串。
我怎样才能克服这个问题。还有其他格式我可以保存吗?或者我应该更改下面使用的netlogo代码:
let itemsAB read-from-string (word "[" file-read-line "]")
谢谢。
答案 0 :(得分:4)
我不太了解Excel,但如果您无法在电子表格中或出口时无需添加引号,我会感到惊讶。
话虽如此,你也可以在NetLogo中解决这个问题。
使用read-from-string (word "[" file-read-line "]")
非常有用,但只有在数据格式正确时才有效。在您的情况下,您将需要使用不同的方法。
您需要的第一件事是记者可以根据某些分隔符拆分字符串。您可以在NetLogo String Extension中找到一个,但这里有一个直接写在NetLogo中的内容:
to-report split [ string delim ]
report reduce [
ifelse-value (?2 = delim)
[ lput "" ?1 ]
[ lput word last ?1 ?2 but-last ?1 ]
] fput [""] n-values (length string) [ substring string ? (? + 1) ]
end
例如,调用split "a-b-c" "-"
会报告["a" "b" "c"]
。但在你的情况下,如果我没有弄错的话,你的字段会被制表符分开。 NetLogo中的标签字符为\t
,因此它类似于split "a\tb\tc" "\t"
。
以下是您现在可以阅读文件内容的方法:
to read-content
let line1 "MyAge\t20\tMyYear\t1994" ; in real life, you'll use file-read-line
let items split line1 "\t"
show items ; will be: ["MyAge" "20" "MyYear" "1994"]
; If you know the types, you can read the items one by one.
; Only apply `read-from-string` to numbers:
let itemsAB1 (list
item 0 items
read-from-string item 1 items
item 2 items
read-from-string item 3 items
)
show itemsAB1 ; ["MyAge" 20 "MyYear" 1994]
; You could also "carefully" try to convert everything to numbers:
let itemsAB2 map try-to-read items
show itemsAB2 ; ["MyAge" 20 "MyYear" 1994]
end
to-report try-to-read [ string ]
let result string
carefully [ set result read-from-string string ] []
report result
end
我已经向您展示了两种不同的方式来阅读一行的内容。第一个是最直接的,只尝试转换(使用read-from-string
)你已经知道的项目是数字。
第二种方法使用carefully
尝试使用read-from-string
转换每个项目。对于那些成功的人,它会报告转换后的项目。对于那些失败的人,它会报告原始字符串。我把它放在这里是为了完整,但第一种方法不太可能导致不可预见的麻烦。