2015-05-16 80 views
3

是否有將案例類轉換爲CSV值的優雅方法?在Scala中將案例類轉換爲CSV

例如 -

case class Person(name : String, age : Int, gender: String, address : Option[String]) 

我想使用宏,但想知道是否有任何其他的替代品。

注意:case類不包含任何用戶定義的字段。

回答

8

implicitsproductIterator怎麼樣?

implicit class CSVWrapper(val prod: Product) extends AnyVal { 
    def toCSV() = prod.productIterator.map{ 
        case Some(value) => value 
        case None => "" 
        case rest => rest 
        }.mkString(",") 
} 

Person("name", 30, "male", None).toCSV() 
+1

好主意,但需要的' 「':'斯卡拉>人員正確轉義(」 \ 「」 30, 「男性」,無)。 toCSV() res1:String =「,30,male,' –

+3

@AlekseyIzmailov我會將這些細節的細節留給實現者,因爲他們的用例可能允許它 –

+0

'value.toString.replace(」\「」, \\\ 「」)' – John

5

是的,在斯卡拉,有一種方法可以將案例類轉換爲CSV,而無需添加樣板文件。例如PureCSV的基礎上,驚人的Shapeless庫,可以做到這一點:

scala> import purecsv.safe._ 
scala> case class Interval(start: Long, end: Long) 
scala> Interval(10,20).toCSV() 
res1: String = 1,10 
scala> Seq(Interval(1,10),Interval(11,20)).toCSV("|") 
res2: String = 
1|10 
11|20 

注:我PureCSV的作者。

1

product-collections也會爲您生成csv。產品集合非常好;它是免費的反射&與scala-js兼容。

import com.github.marklister.collections.io._ 
case class Foo(a:Int,b:String) 
Seq(Foo(1,"hello"),Foo(2,"World")).csvIterator.mkString("\n") 

res2: String = 
1,"hello" 
2,"World" 

我是產品的集合的作者