csv转xml

package com.hcicloud.sap.service.inspection.impl;

import com.alibaba.fastjson.JSONObject;
import com.csvreader.CsvReader;
import com.hcicloud.sap.common.web.ResultMessage;
import com.hcicloud.sap.service.inspection.TextUploadService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.nio.charset.Charset;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
@Transactional
@PropertySource(value = {"classpath:application.properties"})
public class TextUploadServiceImpl implements TextUploadService {

    //初始化日志对象
    Logger logger = LoggerFactory.getLogger(TextUploadServiceImpl.class);

    /**
     * 文本编码格式
     */
    @Value("${UPLOAD_TEXT_CHARSET:GBK}")
    private String encoding;

    /**
     * 是否为一通对话标识
     */
    @Value("${UPLOAD_TEXT_ID:connectId}")
    private String pConnectId;

    /**
     * 注入jmsTemplate用来发送消息
     */
    @Autowired
    private JmsTemplate jmsTemplate;

    @Value("${activemq.provider.sign}")
    private String sign;

    /**
     * 通过文本路径解析文本
     * @param path
     * @param type
     * @return
     */
    public ResultMessage inspectText(String path,String type) {
        //校验文件路径
        if(path == null || path.equals("")) {
            logger.error("待质检文件路径不存在");
            return new ResultMessage(false,"待质检文件路径不存在");
        }
        //校验文本是否存在
        File file = new File(path);
        if(!file.exists()) {
            logger.error("待质检文件不存在");
            return new ResultMessage(false,"待质检文件不存在");
        }
        //校验文本类型
        if(!TextUploadService.allowableFormat.contains(type)) {
            logger.error("待质检文件格式不正确");
            return new ResultMessage(false,"待质检文件格式不正确");
        }
        //根据文本类型进行不同形式的质检
        ResultMessage resultMessage = null;
        switch (type) {
            case TXT :
                resultMessage = inspectTxt(path);
            case WORD :
                resultMessage = inspectWord(path);
            case CSV :
                resultMessage = inspectCsv(path);
        }

        return resultMessage;
    }

    /**
     * 质检csv格式的文本
     * @param path
     * @return
     */
    public ResultMessage inspectCsv(String path) {
        ResultMessage resultMessage = new ResultMessage(false,"发送解析文本发生异常");
        //初始化通话标识
        String connectId = "";
        //初始化文件流
        CsvReader csvReader = null;
        try {
            //获取读取Csv的对象
            csvReader = new CsvReader(path,',',Charset.forName(encoding));
            //csvReader = new CsvReader(path,',',Charset.forName("GBK"));
            //获取表头
            String[] headers = null;
            //读取表头
            csvReader.readHeaders();
            //第一行有可能只是一个名字  [文字客服历史明细报表, , , , , , , , , , , , , , , , , , , , , , ]
            if(!"".equals(csvReader.getHeaders()[1])) {
                headers = csvReader.getHeaders();
            } else {
                //获取下一行
                csvReader.readRecord();
                headers = csvReader.getValues();
            }
            //初始化一个对话dialog 里面存储JsonObject格式 对话内容
            List<JSONObject> dialog = new LinkedList<>();
            //初始化 集合元素
            String[] sentence = null;
            //获取csv表格中内容 获取对话 进行格式转换
            while(csvReader.readRecord()) {
                //是否是同一次对话 当前一个标识和后一个标识不一样 并且标识不为空字符串
                if(!connectId.equals(csvReader.get(headers.length-1)) && !connectId.equals("")) {
                    //此时获取csv中的数据属于下一次对话
                    String result = transferCsvToJson(dialog);
                    //发送消息
                    jmsTemplate.send(new MessageCreator() {
                        public Message createMessage(Session session) throws JMSException {
                            //直接传递文本格式的字符串
                            TextMessage message = session.createTextMessage(result);
                            //设置消息类型标志
                            message.setStringProperty("type", sign);
                            //返回消息对象
                            return message;
                        }
                    });
                    //handleMessageFromVoiceTransferSystem.handleMessage(message);
                    //处理结束 将集合清空
                    dialog.clear();
                }
                //获取当前行中对话的信息
                sentence = csvReader.getValues();
                //声明局部封装对象
                JSONObject dialogItem = new JSONObject();
                //遍历封装
                for(int i = 0; i < headers.length; i++) {
                    dialogItem.put(headers[i],sentence[i]);
                }
                //添加到结果集中
                dialog.add(dialogItem);
                connectId = csvReader.get(headers.length-1);
            }
            //当读取结束后判断是否还含有对话
            if(dialog.size() > 0) {
                //此时获取csv中的数据属于下一次对话
                String result = transferCsvToJson(dialog);
                //发送消息
                jmsTemplate.send(new MessageCreator() {
                    public Message createMessage(Session session) throws JMSException {
                        //直接传递文本格式的字符串
                        TextMessage message = session.createTextMessage(result);
                        //设置消息类型标志
                        message.setStringProperty("type", sign);
                        //返回消息对象
                        return message;
                    }
                });
                //handleMessageFromVoiceTransferSystem.handleMessage(message);
                //处理结束 将集合清空
                dialog.clear();
            }
            resultMessage.setMessage("发送解析文本成功");
            resultMessage.setSuccess(true);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("解析csv格式的文本过程中发生异常");
        } finally {
            //关流
            csvReader.close();
        }

        return resultMessage;
    }

    /**
     * 质检txt格式的文本
     * @param path
     * @return
     */
    public ResultMessage inspectTxt(String path) {
        return null;
    }

    /**
     * 质检word格式的文本
     * @param path
     * @return
     */
    public ResultMessage inspectWord(String path) {
        return null;
    }

    /**
     * 将 dialog 集合 转换成 json格式 文本进行质检操作
     * @param dialog
     * @return
     */
    public String transferCsvToJson(List<JSONObject> dialog) throws Exception {
        //声明结果
        JSONObject result = new JSONObject();
        //生成uuid
        String uuid = UUID.randomUUID().toString().replace("-","");
        //获取随录数据
        JSONObject sourceData = dialog.get(0);
        //拼接 relateData UUID sourceRelateData
        JSONObject relateData = new JSONObject();
        relateData.put("sourceId",sourceData.getString("connectId").replace("\t",""));
        relateData.put("vtsId","VTS_SERVER_BEIJING");
        relateData.put("audioFormat","text");
        relateData.put("uuid",uuid);
        relateData.put("fileUri","");
        relateData.put("sourceFrom","uploadCsv");
        relateData.put("customerAge","0");
        relateData.put("audioPlayPath","");
        //录音所占字节
        relateData.put("billableseconds","0");
        relateData.put("audioChannel","");
        //拼接时间
        String source = sourceData.getString("会话发起时间").equals("")?"2028/01/01 0:00:00":sourceData.getString("会话发起时间");
        String target = transDateFormat("yyyy/MM/dd H:mm",source,"yyyy-MM-dd HH:mm:ss");
        relateData.put("callTime",target);
        //sourceRelateData
        JSONObject sourceRelaData = new JSONObject();
        sourceRelaData.put("sourceId",sourceData.getString("connectId").replace("\t",""));
        sourceRelaData.put("worksheetagentid",sourceData.getString("服务人员工号").replace("\t",""));
        sourceRelaData.put("worksheetNum",sourceData.getString("connectId").replace("\t",""));
        sourceRelaData.put("createtime",target);
        sourceRelaData.put("agentid",sourceData.getString("服务人员SAP号").replace("\t",""));
        sourceRelaData.put("extensionno",sourceData.getString("客户手机号码").replace("\t",""));
        sourceRelaData.put("audiochannel","0");
        sourceRelaData.put("billableseconds","0");
        sourceRelaData.put("source","uploadText");
        sourceRelaData.put("worksheetstatus","FINISH");
        sourceRelaData.put("voiceType","");
        sourceRelaData.put("audioformat","");
        sourceRelaData.put("calltime",target);
        sourceRelaData.put("businesstype","uploadText");
        sourceRelaData.put("worksheetaccepttime",target);
        sourceRelaData.put("voicepath","");
        sourceRelaData.put("customerid",sourceData.getString("客户号").replace("\t",""));
        sourceRelaData.put("customerphoneno",sourceData.getString("客户手机号码").replace("\t",""));
        sourceRelaData.put("calltype","uploadText");
        sourceRelaData.put("endTime",sourceData.getString("挂机时间"));
        sourceRelaData.put("callSender",sourceData.getString("会话发送方").replace("\t",""));
        sourceRelaData.put("customerName",sourceData.getString("客户姓名").replace("\t",""));
        sourceRelaData.put("ringOffWay",sourceData.getString("挂断方式").replace("\t",""));
        sourceRelaData.put("ringOffOption",sourceData.getString("挂断方").replace("\t",""));
        sourceRelaData.put("evaluateId",sourceData.getString("转评价标识").replace("\t",""));
        sourceRelaData.put("customerIDNumber",sourceData.getString("客户身份证号").replace("\t",""));
        sourceRelaData.put("customerDegree",sourceData.getString("客户等级").replace("\t",""));
        sourceRelaData.put("userId",sourceData.getString("用户ID").replace("\t",""));
        //开始拼接xml
        //获取document工厂对象
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //创建DocumentBuilder
        DocumentBuilder builder = factory.newDocumentBuilder();
        //创建builder对象
        Document document = builder.newDocument();
        //创建根节点
        Element root = document.createElement("result");
        //创建duration节点
        Element duration = document.createElement("duration");
        //设置duration content值 毫秒值
        duration.setTextContent(String.valueOf(Long.parseLong(sourceData.getString("通话时长").replace("\t",""))*1000));
        //创建silence_list
        Element silence_list = document.createElement("silence_list");
        //创建第二个silence_list
        Element sentence_list = document.createElement("sentence_list");
        //初始化 total_time
        long total_time = 0l;
        int i = 0;
        //遍历dialog 封装sentence_list
        Iterator<JSONObject> iterator = dialog.iterator();
        while(iterator.hasNext()) {
            //获取对话对象
            JSONObject dialogItem = iterator.next();
            //创建silence对象
            Element silence = document.createElement("silence");
            //创建sentence对象
            Element sentence = document.createElement("sentence");
            //创建text对象
            Element text = document.createElement("text");
            //创建word_list对象
            Element word_list = document.createElement("word_list");
            //创建word对象
            Element word = document.createElement("word");
            //设置通用时间属性
            silence.setAttribute("start",String.valueOf(total_time));
            sentence.setAttribute("start",String.valueOf(total_time));
            word.setAttribute("start",String.valueOf(total_time));
            total_time += Long.parseLong(dialogItem.getString("会话处理时长").replace("\t",""))*1000;
            silence.setAttribute("end",String.valueOf(total_time));
            sentence.setAttribute("end",String.valueOf(total_time));
            word.setAttribute("end",String.valueOf(total_time));
            //给silence_list赋值
            silence_list.appendChild(silence);
            //设置sentence对象特有属性
            sentence.setAttribute("index",String.valueOf(i++));
            sentence.setAttribute("role",dialogItem.getString("会话发送方").equals("\t座席")?"AGENT":"USER");
            //设置word 与 text content 值
            text.setTextContent(dialogItem.getString("会话内容").replace("\t",""));
            word.setTextContent(dialogItem.getString("会话内容").replace("\t",""));
            //给sentence_list赋值
            word_list.appendChild(word);
            sentence.appendChild(text);
            sentence.appendChild(word_list);
            sentence_list.appendChild(sentence);
        }
        //设置total_time属性
        silence_list.setAttribute("total_time",String.valueOf(total_time));
        root.appendChild(duration);
        root.appendChild(silence_list);
        root.appendChild(sentence_list);
        document.appendChild(root);
        //将xml写入输出流中
        TransformerFactory tff = TransformerFactory.newInstance();
        Transformer tf = tff.newTransformer();
        //声明内存输出流  解决中文乱码问题
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        tf.transform(new DOMSource(document), new StreamResult(bos));
        //通过bytes数组设置编码
        byte[] bytes = bos.toByteArray();
        String xmlData = new String(bytes,"UTF-8");
        //封装结果
        result.put("relateData",relateData);
        result.put("UUID",uuid);
        result.put("sourceRelaData",sourceRelaData.toString());
        result.put("xmlData",xmlData);

        return result.toString();
    }

    /**
     * 将指定格式的时间 转换为 目标格式的录音
     * @param sourceFormat
     * @param source
     * @param target
     * @return
     */
    public String transDateFormat(String sourceFormat, String source,String target) {
        try {
            DateFormat df = new SimpleDateFormat(sourceFormat);
            Date date = df.parse(source);
            df = new SimpleDateFormat(target);
            return df.format(date);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("转换时间格式发生异常");
        }
        return "";
    }

    /**
     * 将指定格式时间转换为毫秒值
     * @param sourceFormat
     * @param source
     * @return
     */
    public Long transDateToMillisecond(String sourceFormat, String source) {
        try {
            DateFormat df = new SimpleDateFormat(sourceFormat);
            Date date = df.parse(source);
            return date.getTime();
        }  catch (Exception e) {
            e.printStackTrace();
            logger.error("转换时间为毫秒值时发生异常");
        }
        return 0l;
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值