golang解析excel、csv编码格式

简介: golang解析excel、csv编码格式

前言

比如 utf8gbkGB18030

excel和csv中有多种编码格式,也是比较头疼的。这里提供多种解析方式。开箱即用的工具

源码

// 转为utf8格式
ConvertToString("你的字符")
package utils

import (
  "github.com/axgle/mahonia"
  "golang.org/x/text/encoding/simplifiedchinese"
)

const (
  GBK     string = "GBK"
  UTF8    string = "UTF8"
  UNKNOWN string = "UNKNOWN"
)

func ConvertToStringByCode(src string, srcCode string, tagCode string) string {
  srcCoder := mahonia.NewDecoder(srcCode)
  srcResult := srcCoder.ConvertString(src)
  tagCoder := mahonia.NewDecoder(tagCode)
  _, cdata, _ := tagCoder.Translate([]byte(srcResult), true)
  result := string(cdata)
  return result
}

func ConvertToStringGbkToUtf8(src string) string {
  if isUtf8([]byte(src)) {
    return src
  }
  var srcCode = "gbk"
  var tagCode = "utf-8"
  srcCoder := mahonia.NewDecoder(srcCode)
  srcResult := srcCoder.ConvertString(src)
  tagCoder := mahonia.NewDecoder(tagCode)
  _, cdata, _ := tagCoder.Translate([]byte(srcResult), true)
  result := string(cdata)
  return result
}

func ConvertToString(src string) string {
  if isUtf8([]byte(src)) {
    return src
  }
  if isGBK([]byte(src)) {
    utf8Data, err := simplifiedchinese.GBK.NewDecoder().Bytes([]byte(src))
    if err != nil {
      return src
    }
    if isUtf8(utf8Data) {
      return string(utf8Data)
    } else {
      return ConvertToStringGbkToUtf8(string(utf8Data))
    }
  }
  sink, err := simplifiedchinese.GB18030.NewDecoder().Bytes([]byte(src))
  if err != nil {
    return src
  }
  return string(sink)
}

func isGBK(data []byte) bool {
  length := len(data)
  var i int = 0
  for i < length {
    if data[i] <= 0x7f {
      //编码0~127,只有一个字节的编码,兼容ASCII码
      i++
      continue
    } else {
      //大于127的使用双字节编码,落在gbk编码范围内的字符
      if data[i] >= 0x81 &&
        data[i] <= 0xfe &&
        data[i+1] >= 0x40 &&
        data[i+1] <= 0xfe &&
        data[i+1] != 0xf7 {
        i += 2
        continue
      } else {
        return false
      }
    }
  }
  return true
}

func preNUm(data byte) int {
  var mask byte = 0x80
  var num int = 0
  //8bit中首个0bit前有多少个1bits
  for i := 0; i < 8; i++ {
    if (data & mask) == mask {
      num++
      mask = mask >> 1
    } else {
      break
    }
  }
  return num
}

func isUtf8(data []byte) bool {
  i := 0
  for i < len(data) {
    if (data[i] & 0x80) == 0x00 {
      // 0XXX_XXXX
      i++
      continue
    } else if num := preNUm(data[i]); num > 2 {
      // 110X_XXXX 10XX_XXXX
      // 1110_XXXX 10XX_XXXX 10XX_XXXX
      // 1111_0XXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
      // 1111_10XX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
      // 1111_110X 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
      // preNUm() 返回首个字节的8个bits中首个0bit前面1bit的个数,该数量也是该字符所使用的字节数
      i++
      for j := 0; j < num-1; j++ {
        //判断后面的 num - 1 个字节是不是都是10开头
        if (data[i] & 0xc0) != 0x80 {
          return false
        }
        i++
      }
    } else {
      //其他情况说明不是utf-8
      return false
    }
  }
  return true
}

func GetStrCoding(data []byte) string {
  if isUtf8(data) == true {
    return UTF8
  } else if isGBK(data) == true {
    return GBK
  } else {
    return UNKNOWN
  }
}

目录
相关文章
|
2月前
|
Linux Go iOS开发
IDA 9.2 发布:Golang 改进、新 UI 组件、类型解析等
IDA Pro 9.2 (macOS, Linux, Windows) - 强大的反汇编程序、反编译器和多功能调试器
558 0
|
11月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
2347 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
10月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
11月前
|
人工智能 搜索推荐 API
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
cobalt 是一款开源的流媒体下载工具,支持全平台视频、音频和图片下载,提供纯净、简洁无广告的体验
1670 9
Cobalt:开源的流媒体下载工具,支持解析和下载全平台的视频、音频和图片,支持多种视频质量和格式,自动提取视频字幕
|
12月前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
394 1
|
数据可视化 数据挖掘
Excel条件格式高级应用
【10月更文挑战第20天】Excel条件格式高级应用
440 3
|
数据挖掘
Excel条件格式
【10月更文挑战第21天】Excel条件格式
473 2
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
679 16
|
JSON 数据格式
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
938 2

推荐镜像

更多