Golang实现按特定字符序列筛选并复制到新文件

Golang实现按特定字符序列筛选并复制到新文件 你好。我需要帮助。在我的代码中,指定的.txt文件(包含文本)被复制到指定路径的目录中,但需要修改代码,以便只有那些包含特定字符序列的“行”才被复制到新文件中。我认为这可以通过 Graph 实现,但我不知道具体怎么做。

感谢你的帮助。

package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
)

func main() {
	read := make([]byte, 0, 64)
	var name, name2 string
	var path string
	fmt.Println("Set way to copy file:  ")
	fmt.Scan(&path)
	fmt.Println("Set file name to copy:  ")
	fmt.Scan(&name)
	wd, err := os.Getwd()
	if err != nil {
		fmt.Println("Error:", err)
		return
	}
	os.Chdir(path)
	file, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE, 0755)
	if err != nil {
		fmt.Println(err)
	}
	read, err = ioutil.ReadFile(name)
	defer file.Close()
	os.Chdir(wd)
	fmt.Println("Working Directory:  ", wd)
	fmt.Println("Application:  ", filepath.Join(wd, os.Args[0]))
	d := filepath.Join(wd, "Emperor")
	if err := os.Mkdir(d, 0755); err != nil {
		fmt.Println("Error:", err)
	}
	fmt.Println("Created ", d)
	if err := os.Chdir(d); err != nil {
		fmt.Println("Error:", err)
	}
	fmt.Println("Set name")
	fmt.Scan(&name2)
	file2, err := os.OpenFile(name2, os.O_RDWR|os.O_CREATE, 0755)
	if err != nil {
		fmt.Println("failed to copy the file")
		fmt.Println(err)
	}
	file2.WriteString(string(read))
	fmt.Println("New Working Directory: ", d)
}

更多关于Golang实现按特定字符序列筛选并复制到新文件的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你指的是“类型”吗?

考虑使用正则表达式在文件中搜索模式。 查看此处的示例:https://groups.google.com/g/golang-nuts/c/msMHvOmmzOY?pli=1

更多关于Golang实现按特定字符序列筛选并复制到新文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


package main

import (
	"bufio"
	"fmt"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	var sourcePath, sourceFileName, targetFileName, searchSequence string
	
	fmt.Print("Set path to source file: ")
	fmt.Scan(&sourcePath)
	
	fmt.Print("Set source file name: ")
	fmt.Scan(&sourceFileName)
	
	fmt.Print("Set search character sequence: ")
	fmt.Scan(&searchSequence)
	
	fullSourcePath := filepath.Join(sourcePath, sourceFileName)
	
	sourceFile, err := os.Open(fullSourcePath)
	if err != nil {
		fmt.Printf("Error opening source file: %v\n", err)
		return
	}
	defer sourceFile.Close()
	
	wd, err := os.Getwd()
	if err != nil {
		fmt.Printf("Error getting working directory: %v\n", err)
		return
	}
	
	targetDir := filepath.Join(wd, "Emperor")
	if err := os.MkdirAll(targetDir, 0755); err != nil && !os.IsExist(err) {
		fmt.Printf("Error creating target directory: %v\n", err)
		return
	}
	
	fmt.Print("Set target file name: ")
	fmt.Scan(&targetFileName)
	
	fullTargetPath := filepath.Join(targetDir, targetFileName)
	targetFile, err := os.Create(fullTargetPath)
	if err != nil {
		fmt.Printf("Error creating target file: %v\n", err)
		return
	}
	defer targetFile.Close()
	
	scanner := bufio.NewScanner(sourceFile)
	writer := bufio.NewWriter(targetFile)
	linesCopied := 0
	
	for scanner.Scan() {
		line := scanner.Text()
		if strings.Contains(line, searchSequence) {
			_, err := writer.WriteString(line + "\n")
			if err != nil {
				fmt.Printf("Error writing to target file: %v\n", err)
				return
			}
			linesCopied++
		}
	}
	
	writer.Flush()
	
	if err := scanner.Err(); err != nil {
		fmt.Printf("Error reading source file: %v\n", err)
		return
	}
	
	fmt.Printf("Successfully copied %d lines containing '%s' to %s\n", 
		linesCopied, searchSequence, fullTargetPath)
}

这个修改后的代码实现了按特定字符序列筛选行的功能:

  1. 使用bufio.Scanner逐行读取源文件
  2. 对每一行使用strings.Contains()检查是否包含指定的字符序列
  3. 只将包含该序列的行写入新文件
  4. 使用bufio.Writer提高写入效率
  5. 添加了行数统计功能

关键修改:

  • 移除了ioutil.ReadFile(),改用逐行处理
  • 添加了搜索序列的输入
  • 使用strings.Contains()进行行筛选
  • 保持了原有的目录创建和文件操作逻辑
回到顶部