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
不要在循环中使用"+"来连接字符串。应该像这样使用 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)
}
主要修改点:
- 移除了未使用的
go/scanner导入 - 使用
filepath.Join()来安全地构建文件路径 - 添加了文件扩展名检查,只处理
.txt文件 - 使用
strings.Builder来高效构建字符串 - 为每个文件单独构建一行内容,然后用换行符连接
- 正确关闭文件句柄
- 修正了错误处理逻辑
对于您的示例文件,输出将是:
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
每个文件的内容会被合并为单行,不同文件之间用换行符分隔。

