2

我想读取一个相当大的 csv 文件并对其进行处理(切片、骰子、汇总等)interactively(数据探索)。我的想法是将文件读入数据库(H2)并使用 SQL 来处理它:

  1. 阅读文件:我使用Ostermiller csv 解析器

  2. 确定每一列的类型:我随机选择50行,导出每一列的类型(int、long、double、date、string)

  3. 我想用Squeryl来处理。为此,我需要动态创建一个案例类。这就是目前为止的瓶颈!

  4. 我将文件上传到 H2 并使用任何 SQL 命令。

我的问题:

  • 在 Scala 中有更好的通用交互方式吗?
  • 有没有办法解决第三点?换一种说法,给定一个类型列表(对应于 csv 文件中的列),是否可以动态创建对应于 Squeryl 中的表的案例类?据我了解,我可以使用宏来做到这一点,但我没有足够的曝光率来做到这一点。
4

3 回答 3

3

我认为你对第一个问题的态度听起来很合理。

关于您的第二个问题 - 作为 drexin 答案的补充 - 可以使用ASM等库生成字节码。使用这样的库,您可以生成与案例类相同的字节码。

于 2012-05-14T20:39:36.330 回答
2

由于 scala 是一种静态类型语言,除了反射之外没有其他方法可以动态创建类,反射是缓慢而危险的,因此应该避免。即使使用宏,您也无法做到这一点。宏在编译时评估,而不是在运行时评估,因此您需要在编译时了解数据的结构。如果您甚至不知道您的数据是什么样的,您需要案例类做什么?与使用 a 相比,您期望从中获得什么好处Map[String,Any]

于 2012-05-14T12:34:44.387 回答
1

我认为您想创建一个密封的基类,然后创建一系列案例类作为它的子类。每个子类将包装您支持的不同类型。

然后,您可以使用匹配语句和解构来处理各个类型,并通过基类在无关紧要的地方对它们进行通用处理。

你不能为整行创建一个类,因为你在编译时对它的了解不够。即使您可以动态生成一个类(可能通过在运行时调用编译器),您也无法从类型安全中受益,并且您的大多数代码无论如何都必须对其进行通用处理。

于 2012-06-29T21:01:55.000 回答