使用JsonParser流式解析json,并使用DataFrame进行矩阵转置。
需求:将一个结构化不太好的原始的大json文件,转为CSV文件,有{{}}嵌套也有[[ ]]嵌套。
思路:
1 .肯定不能使用原始的LIst Map…
2. 尽量减少对line 的遍历。
3. 可适当采用中间文件。
package convert;import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import joinery.DataFrame;import java.io.*;
import java.math.BigDecimal;/*** @author zijian Wang* @date 2021/8/10 16:04* @VERSION 1.0*/
public class convert2traindata {private static String filePath_origin ;private static String outPutPath;//intermediateFileprivate static String filePath_model = "E:\\change\\model_train.csv";private static String filePath_model_index = "E:\\change\\model_train_index.csv";private static String filePath_model_transpose = "E:\\change\\transpose.csv";private static String filePath_model_res;//window//private static String delimiter="\\";//linuxprivate static String delimiter="/";public static void main(String[] args) throws IOException {//加载参数1.输入路径和文件名//加载参数2 输出的路径,名称和源输入文件一样。//linuxfilePath_origin=args[0];outPutPath =args[1];//window
/* filePath_origin="E:\\change\\origin.json";outPutPath ="E:\\change\\";*/String outPutFileName= filePath_origin.substring(filePath_origin.lastIndexOf(delimiter)+1,filePath_origin.lastIndexOf("."));//生成输出路径filePath_model=outPutPath+outPutFileName+"_model.csv";filePath_model_index=outPutPath+outPutFileName+"_index.csv";filePath_model_transpose=outPutPath+outPutFileName+"_transpose.csv";filePath_model_res=outPutPath+outPutFileName+".csv";long startTime = System.currentTimeMillis();convert2traindata();mergeFile(filePath_model, filePath_model_index);transpose(filePath_model_index);printResFile(filePath_model_transpose, filePath_model_res);long endTime = System.currentTimeMillis();System.out.println("程序运行时间: " + (endTime - startTime) + "ms");}/***使用jsonParser 提取数据并写入中间文件*/public static void convert2traindata() throws IOException {JsonFactory jasonFactory = new JsonFactory();JsonParser jsonParser = null;PrintWriter writer_model = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(filePath_model)), "UTF-8"));PrintWriter writer_index = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(filePath_model_index)), "UTF-8"));PrintWriter writer_res = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(filePath_model_res)), "UTF-8"));jsonParser = jasonFactory.createJsonParser(new File(filePath_origin));jsonParser.nextToken();while (jsonParser.nextToken() != JsonToken.NOT_AVAILABLE) {String fieldname = jsonParser.getCurrentName();if (jsonParser.nextToken() == null || fieldname == null) {jsonParser.close();writer_model.close();break;}int filedIndex = 0;//读取stdNames 要求写入的字段,直接放入結果文件中if (fieldname != null && fieldname.equals("stdNames")) {writer_res.append("ts").append(",");while (jsonParser.currentToken() != JsonToken.END_ARRAY) {if (filedIndex == 16) {writer_res.append(jsonParser.getText());} else {writer_res.append(jsonParser.getText()).append(",");}filedIndex++;jsonParser.nextToken();}writer_res.write("\n");writer_res.close();}//读取times数据int transposeIndex = 0;if (fieldname != null && fieldname.equals("times")) {jsonParser.nextToken();while (jsonParser.currentToken() != JsonToken.END_ARRAY) {transposeIndex++;writer_model.append(new BigDecimal(jsonParser.getText()).toPlainString()).append(",");jsonParser.nextToken();}//生成索引文件for (int i = 0; i < transposeIndex; i++) {writer_index.append(String.valueOf(i)).append(",");}writer_index.append("\n");writer_index.close();}//读取dataMatrix数据if (fieldname != null && fieldname.equals("dataMatrix")) {writer_model.append("\n");while (jsonParser.currentToken() != JsonToken.END_OBJECT) {if (jsonParser.getText() != "[") {if (jsonParser.getText() == "]") {writer_model.append("\n");} else {writer_model.append(jsonParser.getText()).append(",");}}jsonParser.nextToken();}writer_model.close();}}jsonParser.close();}/*** 合并文件和索引** @param file1* @param file2* @throws IOException*/public static void mergeFile(String file1, String file2) throws IOException {BufferedReader inputStream = null;BufferedWriter outputStream = null;inputStream = new BufferedReader(new FileReader(file1));FileWriter filewriter = new FileWriter(new File(file2), true);outputStream = new BufferedWriter(filewriter);String count;while ((count = inputStream.readLine()) != null) {if (count != "" && count.length() > 17) {outputStream.write(count);outputStream.write("\n");}}outputStream.flush();outputStream.close();inputStream.close();new File(file1).delete();}/*** 矩阵转置** @param filePath* @throws IOException*/public static void transpose(String filePath) throws IOException {DataFrame df = null;df = DataFrame.readCsv(filePath,",",DataFrame.NumberDefault.LONG_DEFAULT);DataFrame<String> df3 = df.transpose();System.out.println(df3.length());for (int i=0;i<df3.length()-1;i++){String value=new BigDecimal(String.valueOf(df3.get(i,0))).toPlainString();df3.set(i,0,value);}df3.writeCsv(filePath_model_transpose);new File(filePath).delete();}/*** 生成结果文件** @param file1* @param file2* @throws IOException*/public static void printResFile(String file1, String file2) throws IOException {BufferedReader inputStream = null;BufferedWriter outputStream = null;FileWriter filewriter = null;inputStream = new BufferedReader(new FileReader(file1));filewriter = new FileWriter(new File(file2), true);outputStream = new BufferedWriter(filewriter);String count;int lineCode = 0;while ((count = inputStream.readLine()) != null) {if (count != "" && count.length() > 17 && lineCode > 0) {outputStream.write(count);outputStream.write("\n");}lineCode++;}outputStream.flush();outputStream.close();inputStream.close();new File(file1).delete();}
}
测试后3000行的json需要0.3S左右。
3w行的大约2.8S执行完。效率应对基本需求完全够用~
使用JsonParser流式解析json,并使用DataFrame进行矩阵转置。相关推荐
- ajax流式传输,直接流式传输JSON以响应Jackson
小编典典 您要解决的问题是 return writer.writeValueAsString(getData); 造成太大的String并导致了OutOfMemoryError.Jackson支持St ...
- Android剥洋葱式解析JSON数据
概述 首先,为什么我要说解析JSON数据像是在剥洋葱呢,请看http://wthrcdn.etouch.cn/weather_mini?city=北京这是一串天气预报的JSON数据 得到如下: 假如这 ...
- Golang zip流式解析器
Golang标准库 archive/zip 提供了对zip压缩包的解析功能,主要的NewReader方法签名为: func NewReader(r io.ReaderAt, size int64) ( ...
- Php流式 大文件,如何使用PHP解析XML大文件
如果使用 PHP 解析 XML 的话,那么常见的选择有如下几种:DOM.SimpleXML.XMLReader.如果要解析 XML 大文件的话,那么首先要排除的是 DOM,因为使用 DOM 的话,需要 ...
- 如何使用Node.js解析JSON?
我应该如何使用Node.js解析JSON? 是否有一些模块可以安全地验证和解析JSON? #1楼 我想提一下,全局JSON对象还有其他选择. JSON.parse和JSON.stringify都是同步 ...
- gson 解析json_Gson示例教程解析JSON
gson 解析json Welcome to Gson Example Tutorial. In last post we looked at the Java JSON API and you ca ...
- 基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件
基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件 致谢 1 为什么要使用流式输入输出(使用情景) 2 目标.主要思路及相关方法 2.1 目标 2.2 ...
- 迈克尔 杰克逊mv_用杰克逊流式传输大型JSON文件– RxJava常见问题解答
迈克尔 杰克逊mv 在上一篇文章中,我们学习了如何解析过大的XML文件并将其转换为RxJava流. 这次让我们看一个大的JSON文件. 我们的示例将基于微小的colors.json,其中包含将近150 ...
- 用杰克逊流式传输大型JSON文件– RxJava常见问题解答
在上一篇文章中,我们学习了如何解析过大的XML文件并将其转换为RxJava流. 这次让我们看一个大的JSON文件. 我们的示例将基于微小的colors.json,其中包含将近150种这种格式的记录: ...
最新文章
- vs2012下编码引起的一个神坑
- oracle 11.2.0.3 asm非rac双机,oracle11.2.0.4 rac asm启动故障
- 网络安全系列之二十一 配置IPSEC安全策略
- Reading——简约至上
- 爬取京东商品分类和链接
- 小程序textarea的行间距_微信小程序组件:textarea多行输入框解读和分析
- git 如何删除缓存的远程分支列表
- 【详解】BiLSTM+CRF模型
- Win32学习笔记(21)内存映射文件
- 设计模式(20):外观模式Facade
- 2.5导入和混合配置 P61 Spring实战 第四版
- Python pass 语句
- ionic开发记账软件《易跟金》
- 微信小程序超过屏幕高度后显示底部图标
- SMP并行编程为什么这么难-从Linux自旋锁到图灵机
- React.Component
- JAVA个人博客系统毕业设计,个人博客系统设计与实现,个人博客网页设计毕设作品
- 金融业XIRR函数的算法思想与实现,java/plsql
- SpringCloud五大神兽之Eureka服务注册(一)
- 爱因斯坦为什么那么牛,看看大家怎么说?