当前位置: 首页 > article >正文

使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应

  • 使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应
  • 我要用 chatgpt,也问过,但是比 deepseek 还是差一个级别,具体如下:
package main

import (
	"bufio"
	"bytes"
	"fmt"

	"golang.org/x/net/html/charset"
	"golang.org/x/text/encoding/unicode"
	"golang.org/x/text/transform"
	"io"
	"os"
	"strings"
)

// detectBOM 检测常见的BOM类型并返回编码名称和BOM长度
func detectBOM(b []byte) (enc string, bomLen int) {
	// UTF-8 BOM
	if len(b) >= 3 && b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF {
		return "UTF-8 BOM", 3
	}
	// UTF-16 LE/BE
	if len(b) >= 2 {
		if b[0] == 0xFF && b[1] == 0xFE {
			return "UTF-16LE", 2
		}
		if b[0] == 0xFE && b[1] == 0xFF {
			return "UTF-16BE", 2
		}
	}
	// UTF-32 LE/BE (可能不常见,但示例处理)
	if len(b) >= 4 {
		if b[0] == 0xFF && b[1] == 0xFE && b[2] == 0x00 && b[3] == 0x00 {
			return "UTF-32LE", 4
		}
		if b[0] == 0x00 && b[1] == 0x00 && b[2] == 0xFE && b[3] == 0xFF {
			return "UTF-32BE", 4
		}
	}
	return "", 0
}

// ReadTextFile 逐行读取文本文件,自动处理编码和BOM
func ReadTextFile(filename string) ([]string, error) {
	file, err := os.Open(filename)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	// 读取前4字节用于BOM检测
	bomBuf := make([]byte, 4)
	n, err := file.Read(bomBuf)
	if err != nil && err != io.EOF {
		return nil, err
	}
	bomBuf = bomBuf[:n]

	enc, bomLen := detectBOM(bomBuf)
	var source io.Reader
	var decoder transform.Transformer

	if enc != "" {
		// 处理带BOM的情况
		remaining := bomBuf[bomLen:]
		source = io.MultiReader(bytes.NewReader(remaining), file)
		switch enc {
		case "UTF-8 BOM":
			decoder = unicode.UTF8.NewDecoder()
		case "UTF-16LE":
			decoder = unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewDecoder()
		case "UTF-16BE":
			decoder = unicode.UTF16(unicode.BigEndian, unicode.IgnoreBOM).NewDecoder()
		default:
			return nil, fmt.Errorf("unsupported encoding: %s", enc)
		}
	} else {
		// 无BOM时检测编码
		source = io.MultiReader(bytes.NewReader(bomBuf), file)
		br := bufio.NewReader(source)

		// 读取前1024字节进行编码检测
		detectBuf, err := br.Peek(1024)
		if err != nil && err != io.EOF {
			return nil, err
		}
		// 自动检测编码
		e, _, _ := charset.DetermineEncoding(detectBuf, "")
		if e == nil {
			e = unicode.UTF8 // 默认UTF-8
		}
		decoder = e.NewDecoder()
		source = br
	}

	// 创建UTF-8转换Reader
	utf8Reader := transform.NewReader(source, decoder)
	scanner := bufio.NewScanner(utf8Reader)

	var lines []string
	for scanner.Scan() {
		lines = append(lines, scanner.Text())
	}
	if err := scanner.Err(); err != nil {
		return nil, err
	}

	return lines, nil
}

// 过滤双引号已经前后空格
func Filter(lists []string) []string {
	r := make([]string, 0, len(lists))
	for _, list := range lists {
		item := strings.TrimSpace(list)
		if len(item) >= 2 {
			first := item[0]
			last := item[len(item)-1]
			if first == last && first == '"' {
				r = append(r, strings.TrimSpace(item[1:len(item)-1]))
			} else {
				r = append(r, item)
			}
		} else {
			r = append(r, item)
		}
	}
	return r
}
func main() {
	name := "./csv/export.csv"
	lines, err := ReadTextFile(name)
	if err != nil {
		fmt.Println("读取错误:" + err.Error())
		return
	}

	for _, line := range lines {
		lists := Filter(strings.Split(line, "\t"))
		fmt.Println(line + "  ==>  " + strings.Join(lists, ","))
	}
	
}

http://www.kler.cn/a/556355.html

相关文章:

  • 客服系统自动化方案:揭秘全渠道智能服务解决方案 vx: haotsh
  • deepseek linux本地化部署
  • ROM(固态硬盘)与RAM(内存,缓存)
  • Fluent M3U8 v0.5 一款开源免费的m3u8文件下载工具,由B站大佬 @呆唯男友 开发
  • 【NLP】注意力机制
  • buu-[OGeek2019]babyrop-好久不见41
  • Mac arm架构使用 Yarn 全局安装 Vue CLI
  • Brave132编译指南 Linux篇 - Brave简介(一)
  • SkyWalking快速入门
  • ubuntu追加path环境变量
  • 使用爬虫按关键字搜索亚马逊商品:实战指南
  • selenium环境搭建
  • DeepSeek 与网络安全:AI 在网络安全领域的应用与挑战
  • 天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制
  • 上下文感知 AI Agent 将赋予我们的“超能力”
  • 2后端JAVA:下载数据库数据到EXCEL表格?代码
  • [Android]使用AlarmManager设置周期性任务
  • [C++]使用纯opencv部署yolov12目标检测onnx模型
  • idea任意版本的安装
  • 第1章:LangChain4j的聊天与语言模型