如何将案例类序列化为制表符分隔的文本文件?

Cru*_*ata 3 file-io scala data-structures

我有一个List包含相同类型的case类,我正在寻找将其持久化为带有制表符分隔的文本文件的最佳实践

case class mycase1 (x: Int, y:Int , name:String)  
val item1 = new mycase1(1,2,"item1")
val item2 = new mycase1(3,4,"item2")
val item3 = new mycase1(5,6,"item3")

val myList = List (item1,item2,item3)
Run Code Online (Sandbox Code Playgroud)

将上述数据结构写入文件的最佳方法是什么?有这样的事情:

myList.toFile(delimiter="\t")
Run Code Online (Sandbox Code Playgroud)

cmb*_*ter 6

因为case类是a Product,所以你可以简单地使用该productIterator方法按照它们在迭代器中定义的顺序来获取字段.您可以使用它和map列表的mycase1列表,String然后使用它来写入文件.简化示例如下所示:

  case class mycase1 (x: Int, y:Int , name:String)  
  val item1 = new mycase1(1,2,"item1")
  val item2 = new mycase1(3,4,"item2")
  val item3 = new mycase1(5,6,"item3")

  val myList = List (item1,item2,item3)

  val out = new PrintWriter(new FileWriter(pathToMyFile))
  try{
    myList.map(_.productIterator.mkString("\t")) foreach (out.println(_))      
  }
  finally{
    out.close
  }
Run Code Online (Sandbox Code Playgroud)

唯一需要注意的是,字段确实按照它们在case类构造函数中定义的顺序(从左到右)输出.如果你想以另一种方式,我的解决方案将无法正常工作.

  • 您不需要首先转换列表的元素然后打印它们,您可以同时执行此操作:`myList.foreach {e => out.println(e.productIterator.mkString("\ t")) )}` (2认同)
  • 当然你可以,但答案中提供的方法称为"推迟副作用",这样副作用(打印出来)就会发生(换句话说,将副作用免费代码放在`map`中并使用`foreach `仅用于副作用) (2认同)