Golang读取特定CSV文件名丢失首字符问题求助
问题分析与解决方案
这不是编码问题,核心是你误用了strings.Trim函数处理文件名后缀,导致符合cutset的首字符被意外移除。
问题根源
你的代码中使用strings.Trim(..., ".csv")来处理文件名,但strings.Trim的作用是移除字符串两端所有属于cutset(此处为.csv包含的字符:., c, s, v)的字符:
- 当文件名是
config_hr.csv时,开头的c属于cutset中的字符,会被Trim掉,最终得到onfig_hr; - 当文件名改为大写
CONFIG_HR.CSV时,开头的C不在小写的cutset范围内,不会被移除,转小写后就能得到正常的config_hr。
解决方案
替换strings.Trim为strings.TrimSuffix——这个函数专门用于移除字符串末尾的指定后缀,不会影响开头的字符:
// 修正后的字符串处理逻辑 for _, e := range entries { rawName := e.Name() // 替换空格为下划线 replacedName := strings.Replace(rawName, " ", "_", -1) // 移除末尾的.csv后缀 baseName := strings.TrimSuffix(replacedName, ".csv") // 转小写作为表名 tableName := strings.ToLower(baseName) Query_String := "CREATE TABLE IF NOT EXISTS " + tableName + " (\n" // 后续代码保持不变... }
排查思路
- 验证原始文件名:在循环中直接打印
e.Name()的原始值,确认是文件名本身异常还是后续处理导致的问题:fmt.Printf("原始文件名: %q\n", e.Name()) - 分步打印处理结果:输出字符串处理每一步的中间值,定位问题环节:
replaced := strings.Replace(e.Name(), " ", "_", -1) fmt.Printf("替换空格后: %q\n", replaced) trimmed := strings.Trim(replaced, ".csv") fmt.Printf("Trim后: %q\n", trimmed) - 检查隐形字符:打印文件名的字节数组,确认开头是否存在BOM、空字节等不可见控制字符:
fmt.Printf("文件名字节: %x\n", []byte(e.Name()))
内容的提问来源于stack exchange,提问作者Adeep Krishna Keelar
相关产品推荐
相关产品推荐

