LCMS零件同步-字符串解析

本文介绍了一种从包含引号和逗号的复杂CSV文件中解析零件数据的方法,提出了两种不同的解析策略,一种使用自定义对象进行分组和排序,另一种通过追踪索引来连续获取字段。

背景

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));
        }
    }

}

【Koopman】遍历论、动态模态分解和库普曼算子谱特性的计算研究(Matlab代码实现)内容概要:本文围绕【Koopman】遍历论、动态模态分解和库普曼算子谱特性的计算研究展开,重点介绍基于Matlab的代码实现方法。文章系统阐述了遍历理论的基本概念、动态模态分解(DMD)的数学原理及其库普曼算子谱特性之间的内在联系,展示了如何通过数值计算手段分析非线性动力系统的演化行为。文中提供了完整的Matlab代码示例,涵盖数据驱动的模态分解、谱分析及可视化过程,帮助读者理解并复现相关算法。同时,文档还列举了多个相关的科研方向和技术应用场景,体现出该方法在复杂系统建模分析中的广泛适用性。; 适合人群:具备一定动力系统、线性代数数值分析基础,熟悉Matlab编程,从事控制理论、流体力学、信号处理或数据驱动建模等领域研究的研究生、博士生及科研人员。; 使用场景及目标:①深入理解库普曼算子理论及其在非线性系统分析中的应用;②掌握动态模态分解(DMD)算法的实现优化;③应用于流体动力学、气候建模、生物系统、电力系统等领域的时空模态提取预测;④支撑高水平论文复现科研项目开发。; 阅读建议:建议读者结合Matlab代码逐段调试运行,对照理论推导加深理解;推荐参考文中提及的相关研究方向拓展应用场景;鼓励在实际数据上验证算法性能,并尝试改进扩展算法功能。
本系统采用微信小程序作为前端交互界面,结合Spring BootVue.js框架实现后端服务及管理后台的构建,形成一套完整的电子商务解决方案。该系统架构支持单一商户独立运营,亦兼容多商户入驻的平台模式,具备高度的灵活性扩展性。 在技术实现上,后端以Java语言为核心,依托Spring Boot框架提供稳定的业务逻辑处理数据接口服务;管理后台采用Vue.js进行开发,实现了直观高效的操作界面;前端微信小程序则为用户提供了便捷的移动端购物体验。整套系统各模块间紧密协作,功能链路完整闭环,已通过严格测试优化,符合商业应用的标准要求。 系统设计注重业务场景的全面覆盖,不仅包含商品展示、交易流程、订单处理等核心电商功能,还集成了会员管理、营销工具、数据统计等辅助模块,能够满足不同规模商户的日常运营需求。其多店铺支持机制允许平台方对入驻商户进行统一管理,同时保障各店铺在品牌展示、商品销售及客户服务方面的独立运作空间。 该解决方案强调代码结构的规范性可维护性,遵循企业级开发标准,确保了系统的长期稳定运行后续功能迭代的可行性。整体而言,这是一套技术选型成熟、架构清晰、功能完备且可直接投入商用的电商平台系统。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值