golang解析excel、csv编码格式

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 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
  }
}

目录
相关文章
|
21天前
|
数据挖掘
Excel条件格式
【10月更文挑战第21天】Excel条件格式
42 2
|
22天前
|
数据可视化 数据挖掘
Excel条件格式高级应用
【10月更文挑战第20天】Excel条件格式高级应用
31 3
|
4月前
|
数据格式 Python
【Python】已解决:Excel无法打开文件test.xIsx“,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。
【Python】已解决:Excel无法打开文件test.xIsx“,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。
301 0
|
1月前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
168 16
|
1月前
|
前端开发 JavaScript
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
286 5
|
1月前
|
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向量化 增强检索
69 2
|
3月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
87 1
|
3月前
|
前端开发 PHP
ThinkPHP6之Excel解析
ThinkPHP6之Excel解析
52 0
|
3月前
Excel 条件格式
Excel 条件格式
29 0
|
4月前
|
存储 开发工具 git
好的git管理方法,标明项目_编号_(功能,不过还是在没有bug出现时就提交为好)+Excel表管理的格式
好的git管理方法,标明项目_编号_(功能,不过还是在没有bug出现时就提交为好)+Excel表管理的格式