需求:将一个结构化不太好的原始的大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进行矩阵转置。相关推荐

  1. ajax流式传输,直接流式传输JSON以响应Jackson

    小编典典 您要解决的问题是 return writer.writeValueAsString(getData); 造成太大的String并导致了OutOfMemoryError.Jackson支持St ...

  2. Android剥洋葱式解析JSON数据

    概述 首先,为什么我要说解析JSON数据像是在剥洋葱呢,请看http://wthrcdn.etouch.cn/weather_mini?city=北京这是一串天气预报的JSON数据 得到如下: 假如这 ...

  3. Golang zip流式解析器

    Golang标准库 archive/zip 提供了对zip压缩包的解析功能,主要的NewReader方法签名为: func NewReader(r io.ReaderAt, size int64) ( ...

  4. Php流式 大文件,如何使用PHP解析XML大文件

    如果使用 PHP 解析 XML 的话,那么常见的选择有如下几种:DOM.SimpleXML.XMLReader.如果要解析 XML 大文件的话,那么首先要排除的是 DOM,因为使用 DOM 的话,需要 ...

  5. 如何使用Node.js解析JSON?

    我应该如何使用Node.js解析JSON? 是否有一些模块可以安全地验证和解析JSON? #1楼 我想提一下,全局JSON对象还有其他选择. JSON.parse和JSON.stringify都是同步 ...

  6. gson 解析json_Gson示例教程解析JSON

    gson 解析json Welcome to Gson Example Tutorial. In last post we looked at the Java JSON API and you ca ...

  7. 基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件

    基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件 致谢 1 为什么要使用流式输入输出(使用情景) 2 目标.主要思路及相关方法 2.1 目标 2.2 ...

  8. 迈克尔 杰克逊mv_用杰克逊流式传输大型JSON文件– RxJava常见问题解答

    迈克尔 杰克逊mv 在上一篇文章中,我们学习了如何解析过大的XML文件并将其转换为RxJava流. 这次让我们看一个大的JSON文件. 我们的示例将基于微小的colors.json,其中包含将近150 ...

  9. 用杰克逊流式传输大型JSON文件– RxJava常见问题解答

    在上一篇文章中,我们学习了如何解析过大的XML文件并将其转换为RxJava流. 这次让我们看一个大的JSON文件. 我们的示例将基于微小的colors.json,其中包含将近150种这种格式的记录: ...

最新文章

  1. vs2012下编码引起的一个神坑
  2. oracle 11.2.0.3 asm非rac双机,oracle11.2.0.4 rac asm启动故障
  3. 网络安全系列之二十一 配置IPSEC安全策略
  4. Reading——简约至上
  5. 爬取京东商品分类和链接
  6. 小程序textarea的行间距_微信小程序组件:textarea多行输入框解读和分析
  7. git 如何删除缓存的远程分支列表
  8. 【详解】BiLSTM+CRF模型
  9. Win32学习笔记(21)内存映射文件
  10. 设计模式(20):外观模式Facade
  11. 2.5导入和混合配置 P61 Spring实战 第四版
  12. Python pass 语句
  13. ionic开发记账软件《易跟金》
  14. 微信小程序超过屏幕高度后显示底部图标
  15. SMP并行编程为什么这么难-从Linux自旋锁到图灵机
  16. React.Component
  17. JAVA个人博客系统毕业设计,个人博客系统设计与实现,个人博客网页设计毕设作品
  18. 金融业XIRR函数的算法思想与实现,java/plsql
  19. SpringCloud五大神兽之Eureka服务注册(一)
  20. 爱因斯坦为什么那么牛,看看大家怎么说?

热门文章

  1. 房地产数据-python爬虫+数据可视化
  2. 我国目前大数据产业发展现状
  3. iOS图像处理(4)坐标变化
  4. jQuery中的end()方法使用介绍
  5. Failed to introspect Class [com.controller.HardWareController] from ClassLoa在ssm中读取串口信息
  6. MySql将两个字段查询值合并拼接
  7. OCP学习——数据库整库备份恢复实验
  8. 【Python】条件变量、信号变量、事件
  9. Docker创建容器时指定IP
  10. Fedora各个历史版本官方下载地址