将包含文本和数字的Excel .txt文件读入NetLogo

时间:2014-09-04 21:26:37

标签: netlogo

我有一个用Excel编写的文件,它包含文本和数字,例如第1行将包含MyAge 20 MyYear 1994.我将其保存为.txt(文本制表符分隔)文件并尝试将其读入Netlogo。当我在记事本中打开文件时,数字显示为数字,文本显示为“”。 Netlogo不会读取文件说“期望一个常数”。如果我删除文本或用引号手动包围文本,那么它工作正常。所以,如果我的专栏写着:“MyAge”20“MyYear”1994,那么它就是ifne。

对于小型数据集来说,这将是繁琐的,并且大型数据集几乎不可能手动将“”添加到所有字符串。

我怎样才能克服这个问题。还有其他格式我可以保存吗?或者我应该更改下面使用的netlogo代码:

 let itemsAB read-from-string (word "[" file-read-line "]")

谢谢。

1 个答案:

答案 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转换每个项目。对于那些成功的人,它会报告转换后的项目。对于那些失败的人,它会报告原始字符串。我把它放在这里是为了完整,但第一种方法不太可能导致不可预见的麻烦。