2016-05-24 5 views
0

私はスカラーでCSVを読むためにさまざまなライブラリがあることを知っています。私は形のない方法を試みましたが、階層のための一般的な方法でcsvを読むのに問題があります。例えば、 - 各行はint型と文字列またはint型とオプションの文字列のいずれかであるすべてのスカラーのクラス階層のCSVを読む一般的な方法

abstract class A 
case class ChildOneOfA(i:Int,s:String) extends A 
case class ChildTwoOfA(i:Int,os:Option[String]) extends A` 



// Requires generic implementation of T which is subtype of A 

def genericCSVReader[T]:GenericCsvRecordReader[T] = { 
//Generic implementation to return csv record iterator/reader 
} 
+0

あなたはこのADTをどのようにCSVとして表すことができますか? –

+0

意図はcsvがケースクラスの型パラメータに従うということです。 '' ChildOneOfA(i:Int、s:Option [String]) 'のように' '1、HI \ n 2、HELLO" 'または' ChildOneOfA(i:Int、s:String) '1、\ n 2、" HEY "' –

+0

個々の大文字と小文字のクラスが異なる数と型の要素を持つ場合(たとえば 'Boolean'対' Double')はどうでしょうか?あるいは、同じ数とタイプの要素を持つ異なるケースクラスがあったのでしょうか? –

答えて

2

まず、あなたの例は少し奇妙です:私はこのようなものが必要?これは、各行がintとオプションの文字列であるということと同じことですが、2つの選択肢は必要ありません。

しかし、有用な例のために、のは、各行がintやboolean型またはint型とオプションのフロートのいずれかであることを言う(そして、あなたが、論理和を表現するためにEiter\/またはXorを使用したくないと仮定してみましょうしましょう):kantan.csvとそのshapelessモジュールを使用して

sealed trait A 
case class Alternative1(i: Int, b: Boolean) extends A 
case class Alternative2(i: Int, of: Option[Float]) extends A 

、あなたは実際にはかなり自明それを解析することができます

import kantan.csv.ops._ 
import kantan.csv.generic._ 

"""1,true 
2,3.14 
3,""".asCsvReader[A](',', false).foreach(println _) 

asCsvReaderがもたらされますインポートステートメントによって範囲内にある。これは、型パラメータ、各行をデコードする型、および2つの値パラメータ、列セパレータ、および最初の行をスキップするかどうかを示すフラグをとります。

このコード出力:

Success(Alternative1(1,true)) 
Success(Alternative2(2,Some(3.14))) 
Success(Alternative2(3,None)) 

なお:

  • asCsvReaderの戻り値を使用すると、メモリ内の全体CSVをロードする必要はありませんを意味し、構造などのIteratorです。
  • 各行はSuccessまたはFailureのいずれかにラップされ、デコードは決してスローされません(必要がない限り、asUnsafeCsvReaderを使用できます)。
+0

さまざまなケースクラスを明確にするために、私はその質問の下でコメントしました。第二に、私は 'は見つけることができませんでした取得 ' //渡しセパレーターと私のプログラムで動的に 新しいファイル(filename).asCsvReader [T](セパレーター、ヘッダ=ヘッダ) ' ヘッダーとライブラリを試してみました型kantan.csvの証拠パラメータの暗黙の値。RowDecoder [T] ' –

+0

私は問題があると思う。それは、抽象クラスでは機能しません。それは正しく機能します。 –

+0

特徴と抽象的な違いはありませんが、封印する必要があるという事実です。 –

関連する問題