JSP项目国际化词条统计

news2024/9/23 13:18:58

国际化字条匹配并导出为excel格式

需求

将jsp页面里的key值,就是<spring:message code="gsyezer_Single_crystal"/>里的gsyezer_Single_crystal。和对应的字条对应上,并以excel表格形式输出。

  • jsp页面key值示例
<label for=""><spring:message code="xhb_comp_type"/><!-- 组件类型--></label>
<select name="" class="sys_select one_key_moduleType">
    <option value="1"><spring:message code="gsyezer_Single_crystal"/><!-- 单晶--></option>
    <option value="2"><spring:message code="gsyezer_Polycrystalline"/><!-- 多晶--></option>
    <option value="3"><spring:message code="gsyezer_film"/><!-- 薄膜--></option>
</select>
  • 对应字条文件示例

    xhb_comp_type=组件类型
    gsyezer_Single_crystal=单晶
    gsyezer_Polycrystalline=多晶
    gsyezer_film=薄膜
    gsyezer_Material_name=物料名称
    gsyezer_Product_specification=产品规格
    gsyezer_Material_type=物料类型
    gsyezer_Brand=品牌
    ......
    
  • 输出excel表格示例

在这里插入图片描述

python实现

import re
import pandas as pd
# 读取 
with open('D:\\desktop\\workSpace\\index.txt', 'r', encoding = 'UTF-8') as f:
    content = f.read()
# 匹配
pattern = r'spring:message code=\"(.*?)\"'
matches = re.findall(pattern, content)

# 读取lang文件
with open("D:\\desktop\\workSpace\\lang.txt", "r", encoding = "UTF-8") as f:
    content1 = f.readlines()
# 匹配
pattern1 = re.compile(r"(\w+)=(.*)")
matches1 = []
for line in content1:
    match1 = pattern1.search(line)
    if match1:
        for i in matches:
            if i == match1.group(1):
                key, value = i, match1.group(2)
                matches1.append((value, key))
# 去重
df = pd.DataFrame(matches1, columns=["字条", "对应国际化key"])
df = df.drop_duplicates()
# 输出
df.to_excel("D:\\desktop\\workSpace\\index.xlsx", index=False)
#需要两个包:pandas、openpyxl
#pip install pandas 
#pip install openpyxl    

代码解释

打开名为 “C:\Users\yxj\Desktop\workSpace\index.txt” 的文件,并读取文件内容到变量 content 中。

with open('D:\\desktop\\workSpace\\index.txt', 'r', encoding = 'UTF-8') as f:
    content = f.read()

使用正则表达式 r’spring:message code=“(.*?)”’ 在 content 中查找匹配的字符串。匹配结果保存在列表 matches 中。

pattern = r'spring:message code=\"(.*?)\"'
matches = re.findall(pattern, content)

打开名为 “C:\Users\yxj\Desktop\workSpace\lang.txt” 的文件,并逐行读取文件内容到列表 content1 中。

with open("D:\\desktop\\workSpace\\lang.txt", "r", encoding = "UTF-8") as f:
    content1 = f.readlines()

使用正则表达式 r"(\w+)=(.*)" 对 content1 中的每一行进行匹配。匹配的结果保存在列表 matches1 中。

pattern1 = re.compile(r"(\w+)=(.*)")
matches1 = []

对于每个 matches 中的元素,遍历 matches1 中的每一行。如果匹配成功,将匹配的结果以 (value, key) 的形式添加到 matches1 中。

for line in content1:
    match1 = pattern1.search(line)
    if match1:
        for i in matches:
            if i == match1.group(1):
                key, value = i, match1.group(2)
                matches1.append((value, key))

使用 pandas 库将 matches1 转换为数据框 df,并设置列名为 “字条” 和 “对应国际化key”。

df = pd.DataFrame(matches1, columns=["字条", "对应国际化key"])

去除数据框中的重复行。

df = df.drop_duplicates()

将数据框保存为名为 “C:\Users\yxj\Desktop\workSpace\index.xlsx” 的 Excel 文件,其中不包含索引列。

df.to_excel("D:\\desktop\\workSpace\\index.xlsx", index=False)

在js中嵌套引入的国际化字条

import re
import pandas as pd

with open('D:\\desktop\\workSpace\\mainjs.txt', 'r', encoding = 'UTF-8') as f:
    content = f.read()
# 待匹配的字符串
text = " spring_lang.oss_Analysis_installationTime,"

a = '(?<=spring_lang.).*?(?=,|\s|\'|\"|\)|;)'

# pattern = r"quick\s+brown\s+(\w+)\s+jumps"

matches = re.findall(a, content)
# print(matches)

pattern1 = re.compile(r"(\w+)=(.*)")

with open('D:\\desktop\\workSpace\\langjsp.txt', 'r', encoding = 'UTF-8') as f:
    # 以数组的形式读入 数组2
    lines = f.readlines()
result = []
for key in matches:
    for line in lines:
        if re.search(key, line):
            result.append(re.findall(r'code="(.+?)"', line)[0])
# result就是key值
# print(result)
# 读取真正的lang包
with open("D:\\desktop\\workSpace\\lang.txt", "r", encoding = "UTF-8") as f:
    content1 = f.readlines()
# print(content1)
pattern1 = re.compile(r"(.*)=(.*)")

matches1 = []
for line in content1:
    match = pattern1.search(line)
    if match:
        # print(match)
        for i in result:
            if i == match.group(1):
                key, value = i, match.group(2)
                matches1.append((value, key))

print(result)
df = pd.DataFrame(matches1, columns=["字条", "对应国际化key"])
df = df.drop_duplicates()

# 将 DataFrame 输出到 Excel 文件中
df.to_excel("D:\\desktop\\workSpace\\index.xlsx", index=False)

使用时需要创建以下几个目录
在这里插入图片描述

  • index.txt为jsp页面
  • index.xlsx为输出字条与对应的key值
  • lang.txt为语言包
  • langjsp.txt为存储封装过的lang的jsp文件
  • mainjs.txt为有引用国际化字条的js文件

格式

  • index.txt

    <div>
        <div class="sys_tab_box mb_15">
            <ul class="sys_tab_list flex_center">
                <li authport="2-2-1"><a href="<%=request.getContextPath()%>/plantbC/plantDevice/getInvPage" class="fs_18"><i class="iconfont mr_5">&#xe6b8;</i>
                    <spring:message code="update_common_inv_sn"/><!-- 逆变器-->
                    </a></li>
                <li authport="2-2-2"><a href="<%=request.getContextPath()%>/plantbC/plantDevice/getDatalogPage" class="fs_18"><i class="iconfont mr_5">&#xe6a5;</i>
                    <spring:message code="device_datalog"/><!-- 数据采集器-->
                    </a></li>
                <li class="curr" authport="2-2-3"><a href="<%=request.getContextPath()%>/plantbC/plantDevice/getMeterPage" class="fs_18"><i class="iconfont mr_5">&#xe6b6;</i>
                    <spring:message code="work_meter"/><!-- 智能电表-->
                    </a></li>
                <li authport="2-2-4"><a href="<%=request.getContextPath()%>/plantbC/plantDevice/getEnvPage" class="fs_18"><i class="iconfont mr_5">&#xe6a8;</i>
                    <spring:message code="work_env"/><!-- 环境监测仪-->
                    </a></li>
            </ul>
        </div>
    
    
  • lang.txt

    #################################      汉语: 2014-11-12     ########################################
    login_login=监控/运维OSS登录
    login_loginOld=旧版
    login_down=下载
    login_help=帮助
    login_nameOrPassError=用户名或密码错误
    login_valiCodeWrong=验证码错误
    login_singIn=登 录
    login_newUser=注 册
    login_forgetPass=忘记密码?
    
  • langjsp.txt

    NO:"<spring:message code="service_question_xuhao"/>",//序号
    devSer:"<spring:message code="service_question_deviceOrder"/>",//设备序列号
    subArrayName:"<spring:message code="asd_Subarray_name"/>",//子阵名称
    faultStrNum:"<spring:message code="sdf_Fault_string"/>",//故障组串数
    strNum:"<spring:message code="sdf_Total_number_strings"/>",//组串总数
    DiagnosisTime:"<spring:message code="new_Diagnosis_time"/>",//诊断时间
    new_mission_name:"<spring:message code="new_mission_name"/>",//任务名称
    xhb_notice:"<spring:message code="new_prompt"/>",//提示
    xhb_details:"<spring:message code="tigo_details"/>",//详情
    
  • mainjs.txt

    var b = compareTime2(minMaxtimeList,minMaxtimeList2);//true为交集
    if(b){
        oComFn.sysAlert(spring_lang.there_is_a_conflict_in_the_time_interval_selected_by_Fengguping);//峰谷平所选时间区间有冲突,请重选!
        return false;
    }else{
        return true;
    }
    

不会python
ctrl C+V手已抽筋

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/823536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 搭建主从集群

文章目录 1. 主从集群架构1.1 准备实例和配置1.2 启动1.3 开启主从关系1.4 测试 2. 主从同步原理2.1 全量同步2.2 增量同步repl_backlog原理 2.3 主从同步优化小结 单节点的 Redis 并发能力有限&#xff0c;要进一步提高 Redis 的并发能力&#xff0c;就需要搭建主从集群&#…

Eureka 学习笔记5:InstanceRegistry

版本 awsVersion ‘1.11.277’ LeaseManager 接口管理实例的租约信息&#xff0c;提供以下功能&#xff1a; 注册实例取消注册实例实例续约剔除过期实例 public interface LeaseManager<T> {/** 注册实例并续约*/void register(T r, int leaseDuration, boolean isRep…

8.1day02苍穹外卖开发

今天完善的功能是新增员工的功能&#xff1b; 新增员工需要添加的数据和员工表中的字段存在差异&#xff0c;用DTO封装传入进来的数据&#xff0c;将DTO实体的数据拷贝给employ类中去&#xff0c;采用的方式是用 BeanUtils.copyProperties(employeeDTO,employee); //前面是数据…

lodop学习

lodop 前提&#xff1a;为满足js调用打印机功能&#xff0c;浏览器自带的打印会弹出一个预览框&#xff0c;实际在应用场景上不需要这个预览弹窗&#xff0c;点击页面打印要直接根据预设好的参数直接打印&#xff0c;这个时候看到了lodop这个插件。 步骤1&#xff1a;官网下载…

一文搞懂Redis架构演化之路

目录 从最简单的开始&#xff1a;单机版 Redis 数据持久化&#xff1a;有备无患 主从复制&#xff1a;多副本 哨兵&#xff1a;故障自动切换 分片集群&#xff1a;横向扩展 总结 这篇文章我想和你聊一聊 Redis 的架构演化之路。 现如今 Redis 变得越来越流行&#xff0c;…

C++ ——stack、queue容器模拟实现及deque容器底层介绍

deque文档 stack文档 deque文档 文章目录 &#x1f345;1. deque容器&#x1f352;deque底层&#x1f352;deque的优势&#x1f352;deque的劣势 &#x1fad0;2. stack模拟实现&#x1f95d;3. queue模拟实现 &#x1f345;1. deque容器 查看文档可发现&#xff0c;栈和队列都…

前中后序迭代统一格式遍历法(最好理解)js版本

说实话,有关二叉树遍历这块,特别是迭代版本,网上好多写的糊里糊涂的,尤其是将三种遍历统一风格的,基本都是看到一头雾水,我想了个比较直观点(自认为) 首先,以下图二叉树为例, 使用迭代法,无论哪种遍历顺序都要首先要开一个栈,同时还需要一个指针cur用于控制当前 接…

Java三大特征之继承【超详细】

文章目录 一、继承概念二、继承的语法三、父类成员访问3.1子类中访问父类的成员变量3.2子类和父类成员变量同名3.3子类中访问父类的成员方法 四、super关键字五、子类构造方法六、super和this七、再谈初始化八、protected 关键字九、继承方式十、final 关键字十一、继承与组合 …

RK DWC3 gadget模块 分析

1. dw3 core代码分析 文件&#xff1a;[drivers/usb/dwc3/core.c] dwc3_probe 函数主要申请dwc3_vendor 参数内存&#xff08;dwc3_vendor的dwc成员即是 struct dwc3结构体参数&#xff09;&#xff0c;对dwc3 通过设备树 以及寄存器信息对 dwc3的成员进行初始化&#xff0c;…

cloudstack平台host加入后,显示CPU speed为0GHz

一、环境说明 操作系统&#xff1a;openEuler 22.03CPU&#xff1a;Kunpeng-920&#xff0c;arm v8cloudstack&#xff1a;4.18libvirtd&#xff1a;6.2.0 二、问题描述 cloudstack平台初始化完成后&#xff0c;第一次加入host&#xff0c;系统虚拟机一直无法正常创建&#…

瑞吉外卖项目----(2)缓存优化

1 缓存优化 1.0 问题说明 1.1 环境搭建 将项目推送到远程仓库里&#xff0c;教程在git 提交远程仓库前建议取消代码检查 创建新的分支v1.0&#xff08;用于实现缓存优化&#xff09;并推送到远程仓库 1.1.1 maven坐标 导入spring-data-redis的maven坐标&#xff1a; &l…

PyTorch代码实战入门

人这辈子千万不要马虎两件事 一是找对爱人、二是选对事业 因为太阳升起时要投身事业 太阳落山时要与爱人相拥 一、准备数据集 蚂蚁蜜蜂数据集 蚂蚁蜜蜂的图片&#xff0c;文件名就是数据的label 二、使用Dataset加载数据 打开pycharm&#xff0c;选择Anaconda创建的pytorch环…

FTP Server

简介 FTP&#xff1a;File Transfer Protocol 文件传输协议&#xff1b;它工作在 OSI 模型的第七层&#xff0c; TCP 模型的第四层&#xff0c; 即应用层&#xff0c; 使用 TCP 传输而不是 UDP&#xff0c; 客户在和服务器建立连接前要经过一个“三次握手”的过程&#xff0c;…

捷码低代码|FreeContainer 自由布局组件详解

背景知识&#xff1a; 1、布局组件&#xff1a; 布局组件是一种用于在用户界面中安排和组织其他组件的组件。它们提供了一种简单的方法来控制和管理页面上组件的位置、大小和层次结构。布局组件可以是容器&#xff0c;可以包含其他组件&#xff0c;并确定它们在界面上的显示方式…

【MyBatis】 框架原理

目录 10.3【MyBatis】 框架原理 10.3.1 【MyBatis】 整体架构 10.3.2 【MyBatis】 运行原理 10.4 【MyBatis】 核心组件的生命周期 10.4.1 SqlSessionFactoryBuilder 10.4.2 SqlSessionFactory 10.4.3 SqlSession 10.4.4 Mapper Instances 与 Hibernate 框架相比&#…

深入理解MVVM架构模式

MVVM原理 MVVM是一种用于构建用户界面的软件架构模式&#xff0c;它的名称代表着三个组成部分&#xff1a;Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;和ViewModel&#xff08;视图模型&#xff09;。MVVM的主要目标是将应用程序的UI与其底层数据模…

SERDES关键技术

目录 一、SERDES介绍 二、SERDES关键技术 2.1 多重相位技术 2.2 线路编解码技术 2.2.1 8B/10B编解码 2.2.2 控制字符&#xff08;Control Characters&#xff09; 2.2.3 Comma检测 2.2.4 扰码&#xff08;Scrambling&#xff09; 2.2.5 4B/5B与64B/66B编解码技术 2.3 包传…

Halcon学习之一维测量实战之测量矩形(一)

一、采集图像 (1)测量充电器 测量充电器的引脚,然后每次旋转充电器,让测量矩形都跟着它转,这就是定位+测量, (2)测量钥匙 (3)测量瓶盖 我们后面还会涉及到拟合的问

牛客网Verilog刷题——VL53

牛客网Verilog刷题——VL53 题目答案 题目 设计一个单端口RAM&#xff0c;它有&#xff1a; 写接口&#xff0c;读接口&#xff0c;地址接口&#xff0c;时钟接口和复位&#xff1b;存储宽度是4位&#xff0c;深度128。注意rst为低电平复位。模块的接口示意图如下。 输入输出描…

HDFS的QJM方案

Quorum Journal Manager仲裁日志管理器 介绍主备切换&#xff0c;脑裂问题解决---ZKFailoverController&#xff08;zkfc&#xff09;主备切换&#xff0c;脑裂问题解决-- Fencing&#xff08;隔离&#xff09;机制主备数据状态同步问题解决 HA集群搭建集群基础环境准备HA集群规…