我有一些数据为.csv.它手动输入到Excel中,我必须将其加载到Scala程序中.
单个记录的大多数字段都是自由文本字符串或数字,但是少数字段来自预先指定的可能字符串的短列表.我为这类信息创建了枚举,比如
object ScaleType extends Enumeration {
val unknown = Value("unknown")
val nominal = Value("nominal")
val ordinal = Value("ordinal")
val interval = Value("interval")
val ratio = Value("ratio")
}
Run Code Online (Sandbox Code Playgroud)
我将csv读入Iterator [Array [String]],对于每一行,我创建一个scala类的新实例,从行中的信息设置其属性.假设在csv中,它是line(8),告诉我们我们使用的比例类型.所以,line是的Array[String],line(8)是一个字符串,其内容应在枚举中列出的值之一.
由于数据是手动输入的,因此包含错误.我使用if语句来查明是否line(8)完全为空,但我无法弄清楚如何查看我得到的字符串是否是一个缩放类型.
val scale = if(line(8).length > 0)
{
ScaleType.withName(line(8))
}
else ScaleType.unknown
Run Code Online (Sandbox Code Playgroud)
我今天准备这样的情况发生:如果有人已经进入规模型"rtnl",我想上面的设置VAL scale到ScaleType.unknown并记录问题(像print("scale reading error on line " + lineNumber就足够了).相反,抛出异常,我不知道如何在异常发生之前检查问题.
你可以使用ValueSet.find:
val scale = ScaleType.values.find(_.toString == line(8)).getOrElse(ScaleType.unknown)
Run Code Online (Sandbox Code Playgroud)
如果效率太低,你可以创建一个地图:
val lookup = ScaleType.values.map(v => (v.toString, v)).toMap
val scale = lookup.get(line(8)).getOrElse(ScaleType.unknown)
Run Code Online (Sandbox Code Playgroud)