Golang扫描文件时如何创建单行读取

Golang扫描文件时如何创建单行读取 我正在扫描文件夹中的.txt文件,并希望在扫描完成后将其合并为一个字符串行。 以下是我编写的代码,能否请您帮忙看看

package main

import (
   "log"
   "os"
   "bufio"
   "io/ioutil"
   "go/scanner"
   "fmt"
)

func ReadFiles(locationPath string) (string,error) {

   folder, err := ioutil.ReadDir(locationPath)
   if err != nil {
      log.Fatal(err)
      //return nil,err

   }
   var lines string

   for _, f := range folder {
      file, err := os.Open(locationPath+f.Name())
      if err != nil {
         log.Fatal(err)
         //return  nil,err
      }

      scanner := bufio.NewScanner(file)
      for scanner.Scan() {
         S:= scanner.Text()
         lines = lines+","+S
      }
      fmt.Println(lines)

      if err := scanner.Err(); err != nil {
         log.Fatal(err)
      }

   }
   return lines,scanner.Error{}
}

func main() {
   var locationPath ="E:/4gproject/"
   ReadFiles(locationPath)

}

我的文本文件内容如下:

文件1 OHM_1577_1438Cafe1 201599 MB jun/01/2019 09:04:08 201599,0,42760,44,49,131172 10w5d03:45:12

文件2 cafe 2 223741 MB jul/16/2019 16:03:31 223741,0,22364,231,161,180228 6w10:00:13

我当前的输出结果是: cafe1 ,362751 MB ,jul/16/2019 18:04:56 ,362751,1518,131146,217,128,171076 ,3w1d22:20:16

cafe1 ,362751 MB ,jul/16/2019 18:04:56 ,362751,1518,131146,217,128,171076 ,3w1d22:20:16,cafe2 ,223741 MB ,jul/16/2019 16:03:31 ,223741,0,22364,231,161,180228 ,6w10:00:13

我期望的输出结果是: cafe1 ,362751 MB ,jul/16/2019 18:04:56 ,362751,1518,131146,217,128,171076 ,3w1d22:20:16

然后换行 ,cafe2 ,223741 MB ,jul/16/2019 16:03:31 ,223741,0,22364,231,161,180228 ,6w10:00:13

请帮助我 谢谢


更多关于Golang扫描文件时如何创建单行读取的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

非常感谢。

更多关于Golang扫描文件时如何创建单行读取的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不要在循环中使用"+"来连接字符串。应该像这样使用 strings.StringBuilder:

var sb strings.Builder
scanner := bufio.NewScanner(file)
for scanner.Scan() {
  line := scanner.Text()
  sb.WriteString(line)
  sb.WriteString(",")
}
lines = TrimSuffix(sb.String(), ",")
fmt.Println(lines)

您的代码有几个问题需要修正,包括导入未使用的包、返回错误的处理方式,以及输出格式问题。以下是修改后的代码:

package main

import (
	"bufio"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"strings"
)

func ReadFiles(locationPath string) (string, error) {
	folder, err := ioutil.ReadDir(locationPath)
	if err != nil {
		return "", err
	}
	
	var lines []string

	for _, f := range folder {
		if filepath.Ext(f.Name()) != ".txt" {
			continue
		}
		
		file, err := os.Open(filepath.Join(locationPath, f.Name()))
		if err != nil {
			return "", err
		}

		var fileContent strings.Builder
		scanner := bufio.NewScanner(file)
		
		for scanner.Scan() {
			line := scanner.Text()
			if fileContent.Len() > 0 {
				fileContent.WriteString(",")
			}
			fileContent.WriteString(line)
		}
		
		file.Close()
		
		if err := scanner.Err(); err != nil {
			return "", err
		}
		
		lines = append(lines, fileContent.String())
	}
	
	result := strings.Join(lines, "\n")
	return result, nil
}

func main() {
	locationPath := "E:/4gproject/"
	result, err := ReadFiles(locationPath)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(result)
}

主要修改点:

  1. 移除了未使用的 go/scanner 导入
  2. 使用 filepath.Join() 来安全地构建文件路径
  3. 添加了文件扩展名检查,只处理 .txt 文件
  4. 使用 strings.Builder 来高效构建字符串
  5. 为每个文件单独构建一行内容,然后用换行符连接
  6. 正确关闭文件句柄
  7. 修正了错误处理逻辑

对于您的示例文件,输出将是:

OHM_1577_1438Cafe1,201599 MB,jun/01/2019 09:04:08,201599,0,42760,44,49,131172,10w5d03:45:12
cafe 2,223741 MB,jul/16/2019 16:03:31,223741,0,22364,231,161,180228,6w10:00:13

每个文件的内容会被合并为单行,不同文件之间用换行符分隔。

回到顶部