网站地图    收藏   

主页 > 后端 > Golang >

golang批量解析svg文件

来源:未知    时间:2022-03-31 18:46 作者:小飞侠 阅读:

[导读] 今天公司有一个需求,要针对历史所有svg写入一个 width 和 height ,一个一个写很不现实,所以想的用golang去写,因为go好用,速度快! 主要思路: 利用 1: os 去批量操作文件 2: 利用 goqu...

今天公司有一个需求,要针对历史所有svg写入一个 width 和 height ,一个一个写很不现实,所以想的用golang去写,因为go好用,速度快!


主要思路:


利用

 1: os 去批量操作文件 

 2: 利用 goquery 去操作dom【你没听错,这是golang中的jquery,灰常好用,学习地址: https://pkg.go.dev/github.com/PuerkitoBio/goquery】

 3: 最后利用 ioutil 去写入文件,为什么不直接用os呢?因为我喜欢...


不BB了,看源码:

package main

import (
"fmt"
"io/ioutil"
"os"
"strings"

"github.com/PuerkitoBio/goquery"
)

var sourcePath string = "/Users/po/www/xxx/Web/assets/images/designer" // 目标目录
var targetPath string = "/Users/po/www/newsvg"
var isOk bool = false

func main() {
fmt.Println(sourcePath)
fmt.Println(targetPath)
// 读取
toReadFile(sourcePath, targetPath)
}

// 读取路径
func toReadFile(sourcePath string, targetPath string) {
osReader, err := os.ReadDir(sourcePath)
if err != nil {
fmt.Println("读取路径错误:", err)
}
fmt.Println(osReader)

for index, dirName := range osReader {
fmt.Println(index, dirName.IsDir(), dirName.Name())
fmt.Printf("%+v\n", dirName)
if isOk {
return
}
// 文件名称
fileName := dirName.Name()
// 如果是目录则递归读取
if dirName.IsDir() {
childPath := sourcePath + "/" + fileName
newChildPath := targetPath + "/" + fileName
fmt.Println("childPath: ", childPath)
// 创建文件夹
CreateMutiDir(newChildPath)
// 读取文件
toReadFile(childPath, newChildPath)
} else {
// 判断是文件
if strings.Contains(fileName, ".svg") {
fileNamePath := sourcePath + "/" + fileName
newfileNamePath := targetPath + "/" + fileName
fileByte, err := ioutil.ReadFile(fileNamePath)
if err != nil {
fmt.Println("读取文件错误:", err)
}
// string(fileByte)
fmt.Println("存在svg文件:", fileName, newfileNamePath)
toChangeQuery(string(fileByte), newfileNamePath)
// isOk = true
}
}

}
}

// query
func toChangeQuery(fileData string, newfileNamePath string) {
dom, err := goquery.NewDocumentFromReader(strings.NewReader(fileData))
if err != nil {
fmt.Println(err)
}
fmt.Println("解析svg:")
firstSvg := dom.Find("svg").First()
viewBoxData, exits := firstSvg.Attr("viewBox")
firstSvgHtml, err := firstSvg.Html()

if err != nil {
fmt.Println("读取firstSvg失败:", err)
}
// firstSvgHtml
fmt.Println(viewBoxData, exits)
fmt.Println("解析svg - end")

if exits {
// 创建新的svg
makeNewSvg(viewBoxData, firstSvgHtml, newfileNamePath)
}

}

// 拼接svg
func makeNewSvg(viewBoxData string, svgHtml string, newfileNamePath string) {
wh := strings.Split(viewBoxData, " ")
newSvgHtml := "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"" + viewBoxData + "\" width=\"" + wh[2] + "px\" height=\"" + wh[3] + "px\" >"
newSvgHtml += svgHtml
newSvgHtml += "</svg>"
newSvgHtmlByte := []byte(newSvgHtml)
err := ioutil.WriteFile(newfileNamePath, newSvgHtmlByte, 0777)
if err != nil {
fmt.Println("写入新文件失败:", err, newfileNamePath)
}

fmt.Println("新svg:", wh, newSvgHtml)
}

//调用os.MkdirAll递归创建文件夹
func CreateMutiDir(filePath string) error {
if !isExist(filePath) {
err := os.MkdirAll(filePath, os.ModePerm)
if err != nil {
fmt.Println("创建文件夹失败,error info:", err)
return err
}
return err
}
return nil
}

// 判断所给路径文件/文件夹是否存在(返回true是存在)
func isExist(path string) bool {
_, err := os.Stat(path) //os.Stat获取文件信息
if err != nil {
if os.IsExist(err) {
return true
}
return false
}
return true
}


升级

利用多线程


// 声明一个等待组
var wg sync.WaitGroup
func main() {
fmt.Println(sourcePath)
fmt.Println(targetPath)
currentTime := time.Now().UnixNano() //获取当前时间,类型是Go的时间类型Time
fmt.Println(currentTime)
// 读取
toReadFile(sourcePath, targetPath)
// 等待所有的任务完成
wg.Wait()
// 循环结束
fmt.Printf("\n %c[1;40;32m%s%c[0m\n\n", 0x1B, allImgs, 0x1B)
fmt.Printf("%+v\n", wg)
currentTime2 := time.Now().UnixNano() //获取当前时间,类型是Go的时间类型Time
fmt.Println((currentTime2 - currentTime) / 1e6)
}

在方法里面

// 读取路径
func toReadFile(sourcePath string, targetPath string) {
osReader, err := os.ReadDir(sourcePath)
if err != nil {
fmt.Println("读取路径错误:", err)
}
fmt.Println(osReader)
wg.Add(1)
// 退出函数关闭
defer wg.Done()
...

以上就是golang批量解析svg文件全部内容,感谢大家支持自学php网。

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论