使用 Golang 扫描文本文件中的单词
Scanning words in a text file by Golang
我想将一个文本文件 (file.txt) 拆分为两个独立的大小相等的文本文件,例如 file1.txt 和 file2.txt。我在拆分中的策略是扫描单词并对其进行计数,然后将单词的前半部分写入file1.txt,其余部分写入file2.txt
这是代码:
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
WordbyWordScan()
}
func WordbyWordScan() {
file, err := os.Open("file.txt.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
count := 0
for scanner.Scan() {
fmt.Println(scanner.Text())
count++
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
fmt.Printf("%d\n", count)
}
https://godoc.org/bufio#example-Scanner--Words
据我所知 scanner.Scan() returns 一个布尔值。在计算了字数之后,如何在 Golang 中实现这样的代码,将前半部分单词写入 file1.txt,其余部分写入 file2.txt?
如果您想将文件切成两半,那么您已经完成了一半。数完字数后,简单地返回并再次读取文件,将一半写入一个文件,一半写入另一个文件:
file.Seek(0,0)
scanner = bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
w:=0
for scanner.Scan() {
var outfile *os.File
if w<count/2 {
outfile=file1
} else {
outfile=file2
}
fmt.Fprintln(outfile,scanner.Text())
w++
}
以上,file1
和file2
是两个输出文件。
如果您不需要将文件切成两半,而只是将一半的单词放在一个文件中,另一半放在另一个文件中,则可以一次完成,无需计算。从第一个开始阅读时,只需切换要写入的文件即可:
w:=0
for scanner.Scan() {
var outfile *os.File
if w%2==0 {
outfile=file1
} else {
outfile=file2
}
fmt.Fprintln(outfile,scanner.Text())
w++
}
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
WordbyWordScan()
}
func WordbyWordScan() {
file, err := os.Open("file.txt.txt")
if err != nil {
log.Fatal(err)
}
file1, err := os.Create("file1.txt.txt")
if err != nil {
panic(err)
}
file2, err := os.Create("file2.txt.txt")
if err != nil {
panic(err)
}
defer file.Close()
defer file1.Close()
defer file2.Close()
file.Seek(0, 0)
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
w := 0
for scanner.Scan() {
var outfile *os.File
if w%2 == 0 {
outfile = file1
} else {
outfile = file2
}
fmt.Fprintln(outfile, scanner.Text())
w++
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
解决方案:
var s []string
.
.
.
for scanner.Scan() {// storing or appending file.txt string values to array s.
s = append(s, scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
//writing to file1 and file2
if len(s)%2 == 0 { // if the occurences of words is an even number.
for i := 0; i <= len(s)/2-1; i++ { // Writing first half of words to file1
fmt.Fprintln(file1, s[i])
}
for j := len(s) / 2; j < len(s); j++ { // Writing second half of words to file2
fmt.Fprintln(file2, s[j])
}
} else { // if the occurences of words is an odd number.
for i := 0; i <= len(s)/2; i++ { // Writing first part of words to file1
fmt.Fprintln(file1, s[i])
}
for j := len(s)/2 + 1; j < len(s); j++ { // Writing second part of words to file2
fmt.Fprintln(file2, s[j])
}
}
.
.
.
我想将一个文本文件 (file.txt) 拆分为两个独立的大小相等的文本文件,例如 file1.txt 和 file2.txt。我在拆分中的策略是扫描单词并对其进行计数,然后将单词的前半部分写入file1.txt,其余部分写入file2.txt 这是代码:
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
WordbyWordScan()
}
func WordbyWordScan() {
file, err := os.Open("file.txt.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
count := 0
for scanner.Scan() {
fmt.Println(scanner.Text())
count++
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
fmt.Printf("%d\n", count)
}
https://godoc.org/bufio#example-Scanner--Words
据我所知 scanner.Scan() returns 一个布尔值。在计算了字数之后,如何在 Golang 中实现这样的代码,将前半部分单词写入 file1.txt,其余部分写入 file2.txt?
如果您想将文件切成两半,那么您已经完成了一半。数完字数后,简单地返回并再次读取文件,将一半写入一个文件,一半写入另一个文件:
file.Seek(0,0)
scanner = bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
w:=0
for scanner.Scan() {
var outfile *os.File
if w<count/2 {
outfile=file1
} else {
outfile=file2
}
fmt.Fprintln(outfile,scanner.Text())
w++
}
以上,file1
和file2
是两个输出文件。
如果您不需要将文件切成两半,而只是将一半的单词放在一个文件中,另一半放在另一个文件中,则可以一次完成,无需计算。从第一个开始阅读时,只需切换要写入的文件即可:
w:=0
for scanner.Scan() {
var outfile *os.File
if w%2==0 {
outfile=file1
} else {
outfile=file2
}
fmt.Fprintln(outfile,scanner.Text())
w++
}
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
WordbyWordScan()
}
func WordbyWordScan() {
file, err := os.Open("file.txt.txt")
if err != nil {
log.Fatal(err)
}
file1, err := os.Create("file1.txt.txt")
if err != nil {
panic(err)
}
file2, err := os.Create("file2.txt.txt")
if err != nil {
panic(err)
}
defer file.Close()
defer file1.Close()
defer file2.Close()
file.Seek(0, 0)
scanner := bufio.NewScanner(file)
scanner.Split(bufio.ScanWords)
w := 0
for scanner.Scan() {
var outfile *os.File
if w%2 == 0 {
outfile = file1
} else {
outfile = file2
}
fmt.Fprintln(outfile, scanner.Text())
w++
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
}
解决方案:
var s []string
.
.
.
for scanner.Scan() {// storing or appending file.txt string values to array s.
s = append(s, scanner.Text())
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
//writing to file1 and file2
if len(s)%2 == 0 { // if the occurences of words is an even number.
for i := 0; i <= len(s)/2-1; i++ { // Writing first half of words to file1
fmt.Fprintln(file1, s[i])
}
for j := len(s) / 2; j < len(s); j++ { // Writing second half of words to file2
fmt.Fprintln(file2, s[j])
}
} else { // if the occurences of words is an odd number.
for i := 0; i <= len(s)/2; i++ { // Writing first part of words to file1
fmt.Fprintln(file1, s[i])
}
for j := len(s)/2 + 1; j < len(s); j++ { // Writing second part of words to file2
fmt.Fprintln(file2, s[j])
}
}
.
.
.