Scala将具有多种记录类型的CSV数据直接读入数据类

时间:2015-11-04 12:27:25

标签: scala csv reflection

我有一个要处理的CSV文件,有多种记录类型。每行的第一列告诉我它是哪种类型的数据。我为每一行编写了一个数据类(超过30个),我可以为每个数据类编写一个构造函数,它接受来自解析器的Array [String],因为这些记录最多有35个字段是错误的容易和凌乱。

由于有多种记录类型,显然没有第一行带有字段名称。

我正在使用Scala 2.11,所以我想到了如何使用反射,而不是使用底层的Java反射,我当然可以直接使用Scala反射,但我很难理解如何。

所以我需要做的是: -

  • 对于文件中的每一行,读取并将记录解析为列
  • 根据字段列创建一个正确的数据类
  • 对于数据对象中的每个字段
  • 根据字段类型,转换列并将其保存在对象

现在这依赖于保持相同顺序的字段,Scala能保证吗?

此外,我发现了许多示例,说明如何查找类的字段,但我还没有找到如何获取和设置字段的值。有人可以指出我正确的方向吗?

以下是前两条记录: - 990001,DD002,1995,20150723,143937,O,NMR,Impel Pro,1998v1.00,,,NMR,1998v2.00 091017,1,HOLSTEIN,HF,D ,N,12,99,280,999,305,1,0.1,3,75,99.9,1.5,1.5,7,7,1,1,7,7,0,0,9,9,22000,25000,29000,32000,15,65,1,1047,Y,Y,C

第一个记录是标题,第二个记录是牛的品种,在这种情况下是荷斯坦牛。 990001表示标题,在我的代码中表示为Header对象,091017表示品种,表示为品种对象。

我想将标题加载到: -

class Header(var dataDictionaryType: String = "", var isoVersion: String = "", var createdOrUploadedDate: Option[LocalDate] = Some(null), var createdOrUploadedTime: Option[LocalTime] = Some(null), var systemStatus: String = "", var senderName: String = "", var receiverName: String = "", var adedNationalVersion:String = "", var processComputerType: String = "", var adedManufacturerVersion: String = ""

请注意,需要添加一些额外的选项。

0 个答案:

没有答案