簡體   English   中英

讀取一個文件作為Map(K,V)並通過V作為鍵,同時讀取第二個文件作為Map

[英]Reading one file as Map(K,V) and pass V as keys while reading the second file as Map

我有兩個文件。 一個是文本文件,另一個是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)。

我正在使用以下代碼閱讀的第二個文件

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)) -> (,))

有人可以指導我如何實現所需的輸出。

這可能會使您接近所追求的目標。 第一個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))

更新

更改Map的( String標識- > Int指數值)到Map的( String標識符- >收集Int指數值)可以做到的。 我不確定能買到什么,但這是可行的。

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))
            .foldLeft(Map[String,Seq[Int]]()){ case (m,(k,v)) =>
               m + (k -> (m.getOrElse(k,Seq()) :+ v))
            }

val resMap = io.Source
               .fromFile(<csv_file>)
               .getLines
               .drop(1)
               .map(_.stripLineEnd.split(",", -1))
               .map{fld => (fld(idx("sdp").head)
                           ,fld(idx("meterNumber").head)
                           ,fld(idx("date").head)
                           ,fld(idx("time").head)) -> (fld(4),fld(5))}
               .toMap

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM