如何用GoLang检查文件字符并将不存在的字符写入目标文件?
解决Go语言检查File1字符是否存在于File2并追加不存在字符的问题
核心思路
- 读取File2的所有字符,存入map实现高效查找
- 遍历File1的每个字符,检查是否已在map中
- 将不存在的字符追加写入File2
优化后的代码
package main import ( "bufio" "fmt" "os" ) func main() { // 打开File1 file1, err := os.Open("file1.txt") if err != nil { fmt.Printf("打开file1失败: %v\n", err) return } defer file1.Close() // 打开File2:支持读写、创建、追加模式 file2, err := os.OpenFile("file2.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644) if err != nil { fmt.Printf("打开file2失败: %v\n", err) return } defer file2.Close() // 将文件指针移到开头,确保能读取到File2的全部内容 if _, err := file2.Seek(0, 0); err != nil { fmt.Printf("移动file2指针失败: %v\n", err) return } // 读取File2的所有字符到map existingChars := make(map[rune]bool) scanner := bufio.NewScanner(file2) scanner.Split(bufio.ScanRunes) // 按Unicode字符拆分,支持多字节字符 for scanner.Scan() { char := rune(scanner.Text()[0]) existingChars[char] = true } if err := scanner.Err(); err != nil { fmt.Printf("读取file2失败: %v\n", err) return } // 读取File1的字符并筛选不存在的 var newChars []rune scanner = bufio.NewScanner(file1) scanner.Split(bufio.ScanRunes) for scanner.Scan() { char := rune(scanner.Text()[0]) if !existingChars[char] { newChars = append(newChars, char) existingChars[char] = true // 标记为已存在,避免重复写入同一字符 } } if err := scanner.Err(); err != nil { fmt.Printf("读取file1失败: %v\n", err) return } // 将新字符写入File2 if len(newChars) > 0 { if _, err := file2.WriteString(string(newChars)); err != nil { fmt.Printf("写入file2失败: %v\n", err) return } fmt.Println("已成功追加不存在的字符到file2") } else { fmt.Println("file1中没有新字符需要写入file2") } }
关键细节说明
- Unicode字符处理:使用
bufio.ScanRunes拆分字符,确保正确处理中文、emoji等多字节字符,避免按字节拆分导致的乱码或错误判断。 - 高效查找:用map存储已存在的字符,查找时间复杂度为O(1),远高于每次遍历File2的O(n)。
- 文件指针处理:打开File2后将指针移到开头,否则读取操作会从文件末尾开始,无法获取已有内容。
- 错误处理:对所有文件操作的错误进行捕获和提示,避免程序静默失败。
- 去重写入:在筛选新字符时同步更新map,避免File1中重复的新字符被多次写入File2。
内容的提问来源于stack exchange,提问作者Aliakbar SMMS
相关产品推荐
相关产品推荐

