scala處理json檔案
阿新 • • 發佈:2019-02-18
讀取json資料處理並儲存
輸入檔案資料為json格式,csid.txt
{"bid": "1","品牌":"奧迪","廠商":"一汽-大眾奧迪","csid":"5"} {"bid": "1","品牌":"奧迪","廠商":"奧迪(進口)","csid":"63"} {"bid": "1","品牌":"奧迪","廠商":"奧迪RS","csid":"276"} {"bid": "56","品牌":"阿斯頓·馬丁","廠商":"阿斯頓·馬丁","csid":"81"} {"bid": "56","品牌":"阿斯頓·馬丁","廠商":"AMR", "csid":"349"} {"bid": "78","品牌":"阿爾法·羅密歐","廠商":"阿爾法·羅密歐","csid":"71"} {"bid": "239","品牌":"艾康尼克","廠商":"艾康尼克ICONIQ Motors","csid":"353"} {"bid": "224","品牌":"Alpina","廠商":"Alpina","csid":"338"} {"bid": "2","品牌":"寶馬","廠商":"華晨寶馬","csid":"25"} {"bid": "2","品牌":"寶馬","廠商":"寶馬(進口)","csid":"59"}
輸出檔案資料為k-v格式,csid.txt
276 品牌_奧迪廠商_奧迪RS
5 品牌_奧迪廠商_一汽-大眾奧迪
59 品牌_寶馬廠商_寶馬(進口)
353 品牌_艾康尼克廠商_艾康尼克ICONIQ Motors
71 品牌_阿爾法·羅密歐廠商_阿爾法·羅密歐
25 品牌_寶馬廠商_華晨寶馬
81 品牌_阿斯頓·馬丁廠商_阿斯頓·馬丁
338 品牌_Alpina廠商_Alpina
63 品牌_奧迪廠商_奧迪(進口)
349 品牌_阿斯頓·馬丁廠商_AMR
操作程式碼:
/** * 將本地json字典檔案轉化為k-v格式(格式:sid 車級_中型車\u0001品牌_大眾u0001) * @param inFilePath 輸入檔案路徑 * @param outFilePath 輸出檔案路徑 */ def proDicFromJson(inFilePath: String, outFilePath: String) { val labelFields = List("車級", "品牌", "車系", "年款", "廠商", "經銷商", "車型報價", "最低價(萬元)", "最高價(萬元)", "省份", "地市", "關注點", "類別", "備註") // 1.獲取檔名 val filename = outFilePath.substring(outFilePath.lastIndexOf("/") + 1, outFilePath.indexOf(".")) // 2.讀取json檔案 val lines = Source.fromFile(inFilePath).getLines().toIterator var dicMap: Map[String, String] = Map() while (lines.hasNext) { val labeljson = JSON.parseFull(lines.next()) labeljson match { //note1! case Some(labelmap: Map[String, Any]) => var value = "" labelFields.foreach { x => if (labelmap.contains(x)) { var tmpVal = labelmap(x) value += x + "_" + labelmap(x) + "\u0001" //多個屬性值使用"\u0001"分割 } } val key = labelmap(filename).toString() dicMap += key -> value case _ => println(labeljson.toString()); } } // 3..獲取指定欄位值並儲存 val writer = new PrintWriter(new File(outFilePath)) dicMap.foreach { x => writer.write(x._1 + "\t" + x._2 + "\n") } writer.close() println(filename + "轉換成功!") }
說明:
- 檔名要和json中key值相同。
重點: