LCMS零件同步-字符串解析

背景

lcms系统中,零件来源于Pbom,通过读取远程文件夹下的BKM_MATERIAL_20160523023514.TXT文件,得到零件主数据(17w+)。

接口定义:
SAP零件接口定义

BKM_MATERIAL_20160523023514.TXT内容如下:

0A6409905H,取力器支架,GETRIEBETRAEGER,1000,上汽大众 SVW,L4H,Tiguan LAH零件,PCK,CKD,9999,未作材料组定义的LC零,PC,只,N

0AF300040T,变速器总成,GETRIEBE,1000,上汽大众 SVW,L4Q,Octavia 暂不用件,P4H,许永钰,125A,”发动机变速器,轴承,合”,PC,只,N

解析字符串

一行字符串中因为包含引号,需要把双引号内的数据算作整体,这样就不能直接通过逗号来分割字符串字段作为结果。

字符串lines:
02T300053M,”1,4L 手动链条发动机的变速箱”,”1,4L 手动链条发动机的变速箱”,1000,上汽大众 SVW,L4K,New Polo暂不用件,P4H,许永钰,125A,”发动机变速器,轴承,合”,PC,只,”M,N”

方法一

  • 定义Line 对象,包含row1index,row2index,row3index和value 工4个属性

  • 定义3个List<Line>分别为list、list2、list3

  • 先按照[,”]分组, 把lines分成4段,把没有逗号的存入list,有逗号的存入list2

  • 再遍历list2,按照[“]分组,如果以逗号开头,则存入list3,否则存入list

  • 最后 以[,]分组,如果不为空,则存入list

  • 最后得到list中就包含了这14个字段啦,然而顺序是乱掉的,所以还要按照row1index,row2index,row3index升序排序

  • 这样每次存入listX的时候,都需要重新构造Line对象

  • Line.java
/**
 * Line.java
 * Created at 2016-3-12
 * Created by mazan
 * Copyright (C) 2016 SHANGHAI VOLKSWAGEN, All rights reserved.
 */
package com.mz.algorithm.str;

import org.apache.commons.lang.builder.CompareToBuilder;


public class Line  implements Comparable<Line>{

    private int row1index;
    private int row2index;
    private int row3index;

    private String value;


    public Line() {
    };



    public Line(String value,int row1index) {
        super();
        this.row1index = row1index;
        this.value = value;
    }




    public Line(String value,int row1index, int row2index) {
        super();
        this.row1index = row1index;
        this.row2index = row2index;
        this.value = value;
    }



    public Line(String value,int row1index, int row2index, int row3index) {
        super();
        this.row1index = row1index;
        this.row2index = row2index;
        this.row3index = row3index;
        this.value = value;
    }



    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public int getRow1index() {
        return row1index;
    }
    public void setRow1index(int row1index) {
        this.row1index = row1index;
    }
    public int getRow2index() {
        return row2index;
    }
    public void setRow2index(int row2index) {
        this.row2index = row2index;
    }
    public int getRow3index() {
        return row3index;
    }
    public void setRow3index(int row3index) {
        this.row3index = row3index;
    }






    @Override
    public String toString() {
        return "Line [row1index=" + row1index + 
                ", row2index=" + row2index + 
                ", row3index=" + row3index + 
                ", value=" + value + "]";
    }

    /**
     * 按照row1index,row2index,row3index排序
     * commons-lang-2.6.jar
     */
    @Override
    public int compareTo(Line o) {
        return new CompareToBuilder()  
        .append(row1index,o.row1index)  
        .append(row2index,o.row2index)  
        .append(row3index,o.row3index)
        .toComparison();
    }
}
  • LineSplit.java
/**
 * LineSplit.java
 * Created at 2016-3-12
 * Created by mazan
 * Copyright (C) 2016 SHANGHAI VOLKSWAGEN, All rights reserved.
 */
package com.mz.algorithm.str;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class LineSplit {

    /**
     * 给定一行字符串,以逗号分隔,但 其中有引号,需要把引号内容作为一个整体
     * 
     * 02T300053M,"1,4L 手动链条发动机的变速箱","1,4L 手动链条发动机的变速箱",1000,上汽大众 SVW,L4K,New Polo暂不用件,P4H,许永钰,125A,"发动机变速器,轴承,合",PC,只,"M,N"";

     * 先按照[,"]分组
     * 再以["]分组
     * 最后 以[,]分组
     * 
     * <p>Description: TODO</p>
     * @param args
     */
    public static void main(String[] args) {
        String lines = "02T300053M,\"1,4L 手动链条发动机的变速箱\",\"1,4L 手动链条发动机的变速箱\"," +
                "1000,上汽大众 SVW,L4K,New Polo暂不用件,P4H,许永钰,125A,\"发动机变速器,轴承,合\",PC,只,\"M,N\"";

        Line(lines);
    }


    public static void Line(String lines){

        List<Line> list = new ArrayList<Line>();
        List<Line> list2 = new ArrayList<Line>();
        List<Line> list3 = new ArrayList<Line>();

        long t1 = System.currentTimeMillis();
        //以[,"]分组
        String[] row1 = lines.split(",\"", 0);

        for(int i =0 ;i< row1.length;i++){
            System.out.println("row1["+i+"]:"+row1[i]);

            Line l1 = new Line(row1[i],i);

            if(noDouHao(row1[i])){
                list.add(l1);
            }
            else {
                list2.add(l1);
            }
        }

        System.out.println("===============");

        //再次筛选
        for(Line line:list2){
            //以(")分组
            String[] row2 = line.getValue().split("\"");

            for(int i =0 ;i< row2.length;i++){
                System.out.println("row2["+i+"]:"+row2[i]);
                //
                Line l2 = new Line(row2[i],line.getRow1index(),i);

                if(row2[i].startsWith(",")){
                    list3.add(l2);
                }
                else {
                    list.add(l2);
                }

            }

        }

        System.out.println("=========================");
        //========再次分组(最后一次)
        for(Line line:list3){
          //以(,)分组
            String[] row3 = line.getValue().split(",");

            for(int i =0 ;i< row3.length;i++){
                System.out.println("row3["+i+"]:"+row3[i]);

                Line l3 = new Line(row3[i],line.getRow1index(),line.getRow2index(),i);

                if(!"".equals(row3[i])){
                    list.add(l3);
                }

            }
        }

        System.out.println("=============初次分组后的list========");
        printLineList(list);



        //的确是分成了14个,但是 顺序变了 TT~,所以要排序
        System.out.println("=============sort list========");
        Line[] lineArr = new Line[list.size()];
        list.toArray(lineArr);
        //排序
        Arrays.sort(lineArr);

        long t2 = System.currentTimeMillis();
        long t = t2-t1;
        System.out.println("耗时:"+t);

        System.out.println("=============sort 后的list========");
        printLineList(lineArr);


    }


    //=======================================================//
    private static void printLineList(List<Line> list){
        for(int i = 0; i<list.size();i++){
            System.out.println(list.get(i));
        }
    }

    private static void printLineList(Object[] list){
        System.out.println("line[].length="+list.length);
        for(int i = 0; i<list.length;i++){
            System.out.println(list[i]);
        }
    }


    private static boolean noDouHao(String str) {
        if(str.indexOf(",") == -1){
            return true;
        }
        return false;
    }

}

方法二

  • 定义一个Index类,包含i, start, end 共3个属性,初始均为0
  • 定义一个prop字符串数组,存放lines按照逗号分隔后的数组
  • 定义一个方法String mergeName(Index index, String[] prop),用来处理prop,并按照顺序返回解析到的零件字段
  • 先取得 prop[index.i++],定义为p

    • 如果不以双引号开头,则返回p
    • 如果以双引号开头,且以引号结尾,同样返回p
    • 如果以引号开头,不以引号结尾:
      • 以index.i 开始,到prop.length截止,i++循环判断
      • 当下一个字段不是以引号结尾,则加在当前p之后,i++继续判断
      • 当下一个字段是以引号结尾,则加在当前p之后,i++,跳出循环
  • 继续执行mergeName方法,得到下一个字段


  • Index.java
/**
 * Index.java
 * Created at 2016-3-12
 * Created by mazan
 * Copyright (C) 2016 SHANGHAI VOLKSWAGEN, All rights reserved.
 */
package com.mz.algorithm.str;

public class Index {

    /**
     * i
     */
    public int i = 0;

    /**
     * start
     */
    public int start = 0;

    /**
     * end
     */
    public int end = 0;

}
  • LineSplit2.java
/**
 * LineSplit2.java
 * Created at 2016-3-12
 * Created by mazan
 * Copyright (C) 2016 SHANGHAI VOLKSWAGEN, All rights reserved.
 */
package com.mz.algorithm.str;

import java.util.ArrayList;
import java.util.List;

public class LineSplit2 {
    /**
     * 引号
     */
    private String seq = "\"";
    /**
     * 逗号
     */
    private String comma = ",";

    /**
     * <p>Description: 解析零件主数据</p>
     * 02T300053M,"1,4L 手动链条发动机的变速箱","1,4L 手动链条发动机的变速箱",1000,上汽大众 SVW,L4K,New Polo暂不用件,P4H,许永钰,125A,"发动机变速器,轴承,合",PC,只,"M,N"
     * @param args
     */
    public static void main(String[] args) {
        String lines = "02T300053M,\"1,4L 手动链条发动机的变速箱\",\"1,4L 手动链条发动机的变速箱\"," +
                "1000,上汽大众 SVW,L4K,New Polo暂不用件,P4H,许永钰,125A,\"发动机变速器,轴承,合\",PC,只,\"M,N\"";

        System.out.println(lines);
        long t1 = System.currentTimeMillis();
        List<String> list = new LineSplit2().getPartInfo(lines);

        long t2 = System.currentTimeMillis();

        long t = t2-t1;
        System.out.println("耗时:"+t);

        printLineList(list);


    }
    /**
     * 
     * <p>Description: 解析一行文本</p>
     * @param line 行
     * @return 零件
     */
    private List<String> getPartInfo(String line) {
        Index index = null;
        index = new Index();
        String[] prop = null;
        prop = line.split(",");

        List<String> p = null;
        p = new ArrayList<String>();

        p.add(mergeName(index, prop));

        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop));
        p.add(mergeName(index, prop)); //第14次需要做Y/N判断

        return p;
    }

    /**
     * 
     * <p>Description: 取得属性值</p>
     * @param index Index
     * @param prop 一行数据
     * @return 属性值
     */
    private String mergeName(Index index, String[] prop) {
        String p = prop[index.i++];
        if (p.startsWith(this.seq) && !(p.startsWith(this.seq) && p.endsWith(this.seq))) {
            for (int i = index.i; i < prop.length; i++) {
                if (prop[i].endsWith(this.seq)) {
                    p = p + this.comma + prop[i];
                    index.i++;
                    break;
                } else {
                    p = p + this.comma + prop[i];
                    index.i++;
                }
            }
        }
        return p;
    }


    private static void printLineList(List<String> list){
        for(int i = 0; i<list.size();i++){
            System.out.println(list.get(i));
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值