index_code_util.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // @Author gmy 2024/8/7 10:41:00
  2. package utils
  3. import (
  4. "fmt"
  5. "github.com/mozillazg/go-pinyin"
  6. "strings"
  7. "unicode"
  8. )
  9. // GenerateIndexCode 指标编码规则:粮油商务网拼音首字母+指标名称拼音首字母,数字、字母保留,特殊字符拿掉
  10. // 例:美湾:9月U:国际大豆进口成本价:期货收盘:张家港 -----> lyswwmw9yUgjddjkcbjqhspzjg
  11. func GenerateIndexCode(sourceName string, indexName string) string {
  12. // 获取汉字的拼音首字母,保留数字和大写字母
  13. firstLetters := getFirstLetters(indexName)
  14. // 组合 sourceName 和处理后的拼音首字母
  15. indexCode := fmt.Sprintf("%s%s", sourceName, firstLetters)
  16. return indexCode
  17. }
  18. // getFirstLetters 获取汉字的拼音首字母,并保留数字和大写字母
  19. func getFirstLetters(input string) string {
  20. // 设置拼音转换选项,只获取首字母
  21. args := pinyin.NewArgs()
  22. args.Style = pinyin.FirstLetter
  23. // 定义用于存储结果的字符串
  24. var result strings.Builder
  25. // 遍历输入字符串中的每个字符
  26. for _, r := range input {
  27. if unicode.IsDigit(r) || unicode.IsUpper(r) {
  28. // 保留数字和大写字母
  29. result.WriteRune(r)
  30. } else if unicode.Is(unicode.Han, r) {
  31. // 如果是汉字,则获取其拼音首字母
  32. py := pinyin.Pinyin(string(r), args)
  33. if len(py) > 0 && len(py[0]) > 0 {
  34. result.WriteString(py[0][0])
  35. }
  36. }
  37. // 对于其他字符,忽略处理
  38. }
  39. return result.String()
  40. }
  41. /*func GenerateIndexCode(sourceName string, indexName string) string {
  42. // 获取拼音首字母
  43. indexInitials := getFirstLetter(indexName)
  44. // 保留源名称中的字母和数字
  45. sourceNameFiltered := filterAlphanumeric(indexName)
  46. // 拼接源名称和首字母
  47. indexCode := sourceName + sourceNameFiltered + indexInitials
  48. // 保留字母和数字,去掉其他特殊字符
  49. re := regexp.MustCompile(`[^a-zA-Z0-9]`)
  50. indexCode = re.ReplaceAllString(indexCode, "")
  51. // 转换为小写
  52. indexCode = strings.ToLower(indexCode)
  53. return indexCode
  54. }
  55. // 获取字符串中的拼音首字母
  56. func getFirstLetter(s string) string {
  57. a := pinyin.NewArgs()
  58. p := pinyin.Pinyin(s, a)
  59. firstLetters := ""
  60. for _, syllables := range p {
  61. if len(syllables) > 0 {
  62. firstLetters += strings.ToUpper(syllables[0][:1])
  63. }
  64. }
  65. return firstLetters
  66. }
  67. // 过滤只保留字母和数字
  68. func filterAlphanumeric(s string) string {
  69. re := regexp.MustCompile(`[^a-zA-Z0-9]`)
  70. return re.ReplaceAllString(s, "")
  71. }*/