go 查询采购单设备事项V3

news2024/9/24 23:29:57

 一、版本说明

本版本在整合上两次的功能基础上,引进ini配置文件的读取事项,快速读取本地配置文件,完成读取设置

第一版:实现了严格匹配模式的查找
https://blog.csdn.net/wtt234/article/details/131979385

第二版:实现了严格匹配模式的查找,以及宽松(关键字的查找)
https://blog.csdn.net/wtt234/article/details/131981275

本版本在整合上两次的功能基础上,引进ini配置文件的读取事项,快速读取本地配置文件,完成读取设置

二、前置知识ini文件读取 

ini配置文件:

#配置文件的配置地方
#全局配置
static_foldel="./tools"
#mysql局部配置
[mysql]
host = localhost:3306
user = root
password = root
dbname = test

[pm]
keydevicelists=语音配线架, 网络配线架, 网络理线架, 终端盒, 光纤收发器, 光纤配线架
devicelists=50对语音配线架, 24口网络配线架, 24口网络理线架, 4口终端盒, 光纤收发器, 96芯光纤配线架

 ini文件读取代码

package main

import (
	"fmt"
	"github.com/go-ini/ini"
)

//中文网站  https://ini.unknwon.cn
//如果您不需要任何对值的自动转变功能(例如递归读取),可以直接获取原值(这种方式性能最佳):
//
//val := cfg.Section("").Key("key name").Value()
//
//判断某个原值是否存在:
//
//yes := cfg.Section("").HasValue("test value")

func main() {
	// 读取INI文件
	cfg, err := ini.Load("pm.ini")
	//cfg, err := ini.Load("pm.ini")
	if err != nil {
		fmt.Printf("Failed to read file: %v", err)
		return
	}

	//全局配置的获取,//分区读取,默认分区用空字符串表示

	quanjupm := cfg.Section("").Key("static_foldel").String()

	fmt.Println(quanjupm)
	//============================
	//获取mysql配置段,//读取指定分区
	mysql := cfg.Section("mysql")
	fmt.Println(mysql.Key("host").String())
	fmt.Println(mysql.Key("user").String())

	//读取一个长字符串格式进行处理
	keydevicelists := cfg.Section("pm")
	keySlice := keydevicelists.Key("keydevicelists").Strings(",")
	fmt.Printf("%v,===>%T", keySlice, keySlice)
	fmt.Println("===================")
	//修改文件
	// 更新INI文件--修改文件
	//mysql.Key("host").SetValue("newhost")
	//mysql.Key("user").SetValue("newuser")
	//mysql.Key("password").SetValue("newpassword")
	//mysql.Key("dbname").SetValue("newdb")
	//cfg.SaveTo("conf.ini")
}

//vals = cfg.Section("").Key("STRINGS").Strings(",")

 

三、全部实现代码

项目组织图:

 

配置文件

pm.ini


#检索关键字的说明信息,keydevicelists,关键字检索
#devicelists,完全内容匹配检索

[pm]
keydevicelists=语音配线架, 网络配线架, 网络理线架, 终端盒, 光纤收发器, 光纤配线架
devicelists=50对语音配线架, 24口网络配线架, 24口网络理线架, 4口终端盒, 光纤收发器, 96芯光纤配线架

全部代码核心;

package main

import (
	"fmt"
	"github.com/go-ini/ini"
	"github.com/xuri/excelize/v2"
	"strings"
)

// 我需要检索的信息
// var devicelists []string = []string{"50对语音配线架", "24口网络配线架", "24口网络理线架", "4口终端盒", "光纤收发器", "96芯光纤配线架"}
// var devicelists = []string{"50对语音配线架", "24口网络配线架", "24口网络理线架", "4口终端盒", "光纤收发器", "96芯光纤配线架"}
//
// var keydevicelists = []string{"语音配线架", "网络配线架", "网络理线架", "终端盒", "光纤收发器", "光纤配线架"}
var devicelists []string

var keydevicelists []string

func init() {
	// 读取INI文件
	cfg, err := ini.Load("pm.ini")
	if err != nil {
		fmt.Printf("Failed to read file: %v", err)
		return
	}

	//读取一个长字符串格式进行处理
	pmget := cfg.Section("pm")
	keydevicelists = pmget.Key("keydevicelists").Strings(",")
	devicelists = pmget.Key("devicelists").Strings(",")

}

// InSlice 判断字符串是否在 slice 中。
func InSlice(items []string, item string) bool {
	for _, eachItem := range items {
		if eachItem == item {
			return true
		}
	}
	return false
}

// InSlice 判断字符串是否在 slice 中。
func includeSlice(items []string, item string) bool {
	for _, eachItem := range items {
		//字符串包含函数,判断表格中名字是否包含我的列表中的内容
		//这样我的找寻字符串中写入关键字就可以了

		if strings.Contains(item, eachItem) {
			return true
		}
	}
	return false
}

func sheet(sheetname string, f *excelize.File, format int) {
	//fmt.Println("+++++++++++++++++++++++++")
	// 获取 Sheet1 上所有单元格
	rows, err := f.GetRows(sheetname)
	if err != nil {
		fmt.Println(err)
		return
	}
	//fmt.Println(rows)

	for _, row := range rows {
		//fmt.Println(row, "========", index)
		//判断每行的里的字段长度,如果是小于6 那就是不获取设备名字和设备价格
		if len(row) < 6 {
			continue
		}
		//获取excel中,设备的名称
		kindname := row[1]
		//获取excel中,设备的数量
		kcount := row[4]

		//如果表格中 kcount没有内容,那就是给复制一个“0”字符串
		if kcount == "" {
			kcount = "0"
		}

		//判断模式,可以进行采用 不同的检索方式
		//1.包含模式,我检索的都是“关键字”  2.严格模式 ,内容必须得一模一样的查找
		if format == 1 {
			//fmt.Println("你匹配的模式为包含模式")

			//包含的调用
			if includeSlice(keydevicelists, kindname) {
				//fmt.Println(sheetname, kindname, "=====++++++=======》", kcount)
				fmt.Printf("获取信息:sheet表:%s;设备名称:%s;设备数量:%s\n;", sheetname, kindname, kcount)
				//fmt.Println()
			}

		} else {
			//fmt.Println("你匹配的模式为严格模式")
			if InSlice(devicelists, kindname) {
				//fmt.Println(sheetname, kindname, "=====++++++=======》", kcount)
				fmt.Printf("获取信息:sheet表:%s;设备名称:%s;设备数量:%s\n;", sheetname, kindname, kcount)
				//fmt.Println()
			}

		}

	}

}

// 读取Excel表格
func main() {

	//fmt.Println("====================")
	//选择的匹配模式:1-包含模式,2-严格模式
	var mode int
	f, err := excelize.OpenFile("by.xlsx")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer func() {
		if err := f.Close(); err != nil {
			fmt.Println(err)
		}
	}()

	sheetnames := f.GetSheetList()
	//fmt.Printf("本excel表格的sheetnames:%s", sheetnames)
	//fmt.Println("===============")
	for {
		fmt.Println("请输入你需要的匹配模式:1-包含模式,2-严格模式,输入 1 或者 2 :")
		fmt.Scan(&mode)
		//fmt.Printf("%T模式为:", mode)
		//退出内容
		if mode == 88 {
			fmt.Println("88..88..")
			break
		}

		//遍历所有的表格sheet,调用处理函数
		for _, sheetname := range sheetnames {
			//fmt.Println(sheetname)
			//fmt.Println("===>", sheetname)
			sheet(sheetname, f, mode)
		}

	}

}

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

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

相关文章

整数转换-C语言/Java

描述 整数转换。编写一个函数&#xff0c;确定需要改变几个位才能将整数A转成整数B。A&#xff0c;B范围在[-2147483648, 2147483647]之间。 示例1&#xff1a; 输入&#xff1a;A 29 &#xff08;或者0b11101&#xff09;, B 15&#xff08;或者0b01111&#xff09; 输出&…

c++数据锁链

题目描述&#xff1a; 创建一个结构体为Node&#xff0c;具有value , next 两个属性&#xff1b; value为整型&#xff0c;用来储存结构体数值&#xff1b; next为Node类型指针&#xff0c;用来指向下一组数据地址&#xff1b; 第1组数据value 5&#xff1b; 第2组数据value …

1400*C. String Equality(greedy)

Example input 4 3 3 abc bcd 4 2 abba azza 2 1 zz aa 6 2 aaabba ddddcc output No Yes No Yes 题意&#xff1a; 字符串a和b&#xff0c;其字母顺序可以任意交换&#xff0c;k个连续的相同字母&#xff0c;可以全部变为大于这个字母的其他字母&#xff08;bb->cc&…

小程序动态隐藏分享按钮

// 禁用分享 wx.hideShareMenu({menus: [shareAppMessage, shareTimeline] })// 显示分享 wx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline] })//私密消息 wx.updateShareMenu({isPrivateMessage: true, })

Docker容器监控之 CAdvisor+InfluxDB+Granfana

通过docker stats命令可以很方便的看到当前宿主机上所有容器的CPU,内存以及网络流量等数据&#xff0c;一般小公司够用了。但是&#xff0c;docker stats统计结果只能是当前宿主机的全部容器&#xff0c;数据资料是实时的&#xff0c;没有地方存储、没有健康指标过线预警等功能…

Tensorflow预训练模型ckpt与pb两种文件类型的介绍

我们在 Tensorflow无人车使用移动端的SSD(单发多框检测)来识别物体及Graph的认识 熟悉了Graph计算图以及在 Tensorflow2.0中function(是1.0版本的Graph的推荐替代)的相关知识介绍 这个tf.function的用法&#xff0c;了解到控制流与计算图的各自作用&#xff0c;无论使用哪种方…

向量vector与erase()

运行代码&#xff1a; //向量vector与erase() #include"std_lib_facilities.h" //声明Item类 struct Item {string name;int iid;double value;Item():name(" "),iid(0),value(0.0){}Item(string ss,int ii,double vv):name(ss),iid(ii),value(vv){}frien…

数据库原理1——《小猫猫大课堂》数据库原理篇

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重要…

分布式锁中的王者方案 - Redission

文章目录 5.1 分布式锁-redission功能介绍5.2 分布式锁-Redission快速入门5.3 分布式锁-redission可重入锁原理5.4 分布式锁-redission锁重试和WatchDog机制5.5 分布式锁-redission锁的MutiLock原理 5.1 分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题&am…

【如何训练一个中英翻译模型】LSTM机器翻译模型部署之onnx(python)(四)

系列文章 【如何训练一个中英翻译模型】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中英翻译模型】LSTM机器翻译模型部署&#xff08;三&#xff09; 【如何…

极简每周计划应用程序WeekToDo

什么是 WeekToDo ? WeekToDo 是一款免费的极简每周计划应用程序&#xff0c;专注于隐私。使用待办事项列表和日历安排您的任务和项目。适用于 Windows、Mac、Linux 或在线。 WeekToDo 是一个免费且开源的极简每周计划程序。借助 WeekToDo&#xff0c;您可以以简单直观的方式定…

Matplotlib_绘制柱状图

绘制柱状图 &#x1f9e9;bar方法 bar()是Matplotlib.pyplot库中用于绘制条形图&#xff08;bar chart&#xff09;的函数。条形图是一种常见的数据可视化图表&#xff0c;用于显示不同类别之间的比较。 函数签名&#xff1a; matplotlib.pyplot.bar(x, height, width0.8, …

ICMP协议(网际报文控制协议)详解

ICMP协议&#xff08;网际报文控制协议&#xff09;详解 ICMP协议的功能ICMP的报文格式常见的ICMP报文差错报文目的站不可达数据报超时 查询报文回送请求或回答 ICMP协议是一个网络层协议。 一个新搭建好的网络&#xff0c;往往需要先进行一个简单的测试&#xff0c;来验证网络…

JDBC Some Templates

JDBCTemplate 是Spring对JDBC的封装&#xff0c;使用JDBCTemplate方便实现对数据的操作。 <!-- orm:Object relationship mapping m对象 关系 映射-->引入依赖 <!-- 基于Maven依赖的传递性&#xff0c;导入spring-content依赖即可导入当前所需的所有…

Spring项目启动报错无法访问org.springframework.boot.SpringApplication:6

当springBoot项目启动后报错如下 解决办法如下&#xff1a;将jdk版本调为11,springBoot版本降低为2.7.12。然后clean&#xff0c;再package重新打包。最后重新启动项目

存储论——经济订货批量的R实现

存储论又称库存理论&#xff0c;是运筹学中发展较早的分支。早在 1915 年&#xff0c;哈李斯&#xff08;F.Harris&#xff09;针对银行货币的储备问题进行了详细的研究&#xff0c;建立了一个确定性的存储费用模型&#xff0c;并求得了最佳批量公式。1934 年威尔逊&#xff08…

第五章 HL7 架构和可用工具 - 创建新的自定义架构

文章目录 第五章 HL7 架构和可用工具 - 创建新的自定义架构创建新的自定义架构定义新段 第五章 HL7 架构和可用工具 - 创建新的自定义架构 创建新的自定义架构 要从管理门户启动自定义架构编辑器&#xff0c;请从主页选择互操作性 > 互操作 > HL7 v2.x >HL7 v2.x 架…

单机和集群以及分布式的浅析

假设一个大系统分为A、B、C、D、E五个模块&#xff0c;也可以认为是五个基本的服务&#xff0c;该系统靠这五个模块协同工作&#xff0c;共同为用户提供服务。 单机 单机&#xff1a;显然&#xff0c;单机表名该系统完完全全的部署在该台机器上&#xff0c;拥有完整的服务&am…

算法38:反转链表【O(n)方案】

一、需求 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例3&#xff…