我有两个文件。一个是文本文件,另一个是CSV。我想将文本文件读取为Map(键,值),并在读取第二个文件(CSV文件)时将第一个文件的这些值作为Map中的键传递。
我能够读取第一个文件并获取Map(key,value)。从此Map中,我提取了值并将这些值作为键传递到第二个文件中,但没有得到想要的结果。
第一个文件-文本文件
sdp:field(0)
meterNumber:field(1)
date:field(2)
time:field(3)
value:field(4),field(5),field(6),field(7),field(8),field(9),
field(10),field(11),field(12),field(13),field(14),
field(15),field(16),field(17)
第二个文件-CSV文件
SDP,METERNO,READINGDATE,TIME,Reset Count.,Kilowatt-Hour Last Reset .,Kilowatt-Hour Rate A Last Reset.,Kilowatt-Hour Rate B Last Reset.,Kilowatt-Hour Rate C Last Reset.,Max Kilowatt Rate A Last Reset.,Max Kilowatt Rate B Last Reset.,Max Kilowatt Rate C Last Reset.,Accumulate Kilowatt Rate A Current.,Accumulate Kilowatt Rate B Current.,Accumulate Kilowatt Rate C Current.,Total Kilovar-Hour Last Reset.,Max Kilovar Last Reset.,Accumulate Kilovar Last Reset.
9000000001,500001,02-09-2018,00:00:00,2,48.958,8.319333333,24.31933333,16.31933333,6,24,15,10,9,6,48.958,41,40
这就是我阅读第一个文件所要做的。
val lines = scala.io.Source.fromFile("D:\\JSON_READER\\dailymapping.txt", "UTF8")
.getLines
.map(line=>line.split(":"))
.map(fields => (fields(0),fields(1))).toMap;
val sdp = lines.get("sdp").get;
val meterNumber = lines.get("meterNumber").get;
val date = lines.get("date").get;
val time = lines.get("time").get;
val values = lines.get("value").get;
现在我可以看到sdp具有field(0),meterNumber具有field(1),date具有field(2),time具有field(3)和value具有field(4)..至field(17)。 / p>
我正在使用以下代码读取的第二个文件
val keyValuePairs = scala.io.Source.fromFile("D:\\JSON_READER\\Daily.csv")
.getLines.drop(1).map(_.stripLineEnd.split(",", -1))
.map{field => ((field(0),field(1),field(2),field(3)) -> (field(4),field(5)))}.toList
val map = Map(keyValuePairs : _*)
System.out.println(map);
以上代码为我提供了以下输出,这是所需的输出。
Map((9000000001,500001,02-09-2018,00:00:00) -> (2,48.958))
但是我想用上述代码中的sdp,meterNumber,date,time替换field(0),field(1),field(2),field(3)。因此,当我阅读第二个文件时,我不必提及密钥,密钥将来自第一个文件。
我尝试更换,但是输出低于期望的输出。
Map((field(0),field(1),field(2),field(3)) -> (,))
有人可以指导我如何实现所需的输出。
答案 0 :(得分:2)
这可能使您接近所追求的目标。第一个Map
用于在CSV数据中查找正确的索引。
val fieldRE = raw"field\((\d+)\)".r
val idx = io.Source
.fromFile(<txt_file>, "UTF8")
.getLines
.map(_.split(":"))
.flatMap(fields => fieldRE.replaceAllIn(fields(1), _.group(1))
.split(",")
.map(fields(0) -> _.toInt))
.toMap
val resMap = io.Source
.fromFile(<csv_file>)
.getLines
.drop(1)
.map(_.stripLineEnd.split(",", -1))
.map{ fld =>
(fld(idx("sdp")),fld(idx("meterNumber")),fld(idx("date")),fld(idx("time"))) ->
(fld(4),fld(5)) }
.toMap
//resMap: Map((9000000001,500001,02-09-2018,00:00:00) -> (2,48.958))
更新
将{{1}个标识符的Map
-> String
索引值更改为{{1}个标识符的Int
-> {{1的集合}}索引值)。我不确定能买到什么,但这是可行的。
Map