在 Scala 中将案例 class 转换为 CSV
Converting a case class to CSV in Scala
有没有一种优雅的方法可以将大小写 class 转换为 CSV 值。
例如-
case class Person( name : String, age : Int, gender: String, address : Option[String])
我正在考虑使用宏,但想知道是否还有其他选择。
注意:案例 class 不包含任何用户定义的字段。
implicits
和 productIterator
怎么样?
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()
是的,在 Scala 中有一种方法可以将大小写 class 转换为 CSV,而无需添加样板文件。比如PureCSV, based on the amazing 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 的作者。
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"
我是产品系列的作者
要完成已接受的答案,您还可以使用模式匹配来匹配产品类型:
implicit class CSVWrapper(val prod: Product) extends AnyVal {
def toCSV: String = prod.productIterator.map{
case p: Product => p.toCSV
case rest => rest
}.mkString(",")
}
这适用于嵌入式案例 类 :
case class Address(street: String, town: String, country: Option[String])
case class Person( name : String, age : Int, gender: Option[String], address : Option[Address])
Person("myname", 30, Some("male"), Some(Address("mystreet", "city", None))).toCSV
// result :
// myname,30,male,mystreet,city,
有没有一种优雅的方法可以将大小写 class 转换为 CSV 值。
例如-
case class Person( name : String, age : Int, gender: String, address : Option[String])
我正在考虑使用宏,但想知道是否还有其他选择。
注意:案例 class 不包含任何用户定义的字段。
implicits
和 productIterator
怎么样?
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()
是的,在 Scala 中有一种方法可以将大小写 class 转换为 CSV,而无需添加样板文件。比如PureCSV, based on the amazing 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 的作者。
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"
我是产品系列的作者
要完成已接受的答案,您还可以使用模式匹配来匹配产品类型:
implicit class CSVWrapper(val prod: Product) extends AnyVal {
def toCSV: String = prod.productIterator.map{
case p: Product => p.toCSV
case rest => rest
}.mkString(",")
}
这适用于嵌入式案例 类 :
case class Address(street: String, town: String, country: Option[String])
case class Person( name : String, age : Int, gender: Option[String], address : Option[Address])
Person("myname", 30, Some("male"), Some(Address("mystreet", "city", None))).toCSV
// result :
// myname,30,male,mystreet,city,