2014-03-04 37 views
1

我有以下代码:过滤图中的迭代器

val rows: Iterator[Map[String,String]] = CSVDictReader(file.getInputStream) 
val parsedProducts = rows.map(x => Product(name = x.get("NAME"), id = x.get("ID"))) 

而且我想用空字符串替换映射条目。单独的地图我可以使用:

filter(_._2.trim.nonEmpty) 

我不能没有引入了一些辅助功能的情况下,返回值没有得到我的周围如何做到这一点的一个很好的方式头空字符串。

编辑:在我的例子中,我只有名字和身份证,但在真实的代码中,很容易有超过十列​​的数据。另外,我需要有None而不是空字符串值。因此name = Option(“”)应替换为name = None

+0

替换或删除?如果你想替换它们,你会从地图中得到空字符串的替代方案吗? –

回答

1

您也可以过滤Option s。

假设您的x.get("NAME")返回Some("")甚至Some(" ")

那么你可以做这样的事情:x.get("NAME").filter(_.trim.nonEmpty)

希望我理解正确你的问题

+0

是的,这工作,但我想避免复制.filter(_。trim.nonEmpty)为每个CSV字段。 –

0

这样的事情?

val rows: Iterator[Map[String,String]] = CSVDictReader(file.getInputStream) 
val parsedProducts = for { 
    row <- rows 
    name <- row.get("NAME") 
    id <- row.get("ID") 
} yield Product(name, id) 

在这里,如果row.get( “NAME”)或row.get( “ID”)返回None,相应的条目将不会被产生。

0

我不知道如果这是你在找什么,但下面的代码片段:

val rows: Iterator[Map[String,String]] = Iterator(Map("NAME" -> " ", "ID" -> "foo"), Map("NAME" -> " ", "ID" -> "")) 
    val fieldNames = List("NAME","ID","ANOTHER COLUMN") 
    val cleanedRows = rows map { row => 
    fieldNames map { fieldName => 
     Map (fieldName -> row.get(fieldName).filter (_.trim.nonEmpty)) 
    } 
    } 

    while(cleanedRows.hasNext) { 
    println(cleanedRows.next) 
    } 

将打印出:

List(Map(NAME -> None), Map(ID -> Some(foo)), Map(ANOTHER COLUMN -> None)) 
    List(Map(NAME -> None), Map(ID -> None), Map(ANOTHER COLUMN -> None)) 

所以在这一点cleanedRows将有您需要创建Product实例的条目。