File 使用GoLang从文件中读取字符串、整数和双精度
当我的数据文件如下所示时,如何从Google Go中的文件读取数据:File 使用GoLang从文件中读取字符串、整数和双精度,file,variables,go,File,Variables,Go,当我的数据文件如下所示时,如何从Google Go中的文件读取数据: SomeString 200.0 2 OtherString 100.6 9 OneMoreString 550.8 1 (字符串、双精度和整数)。我尝试了bufio.readLine和bufio.readString但它们正在读取整行,而我需要单独的变量。类似的方法可能会奏效——如果字符串中有空格,您可能需要以不同的方式处理: package main import ( "fmt"
SomeString 200.0 2
OtherString 100.6 9
OneMoreString 550.8 1
(字符串、双精度和整数)。我尝试了
bufio.readLine
和bufio.readString
但它们正在读取整行,而我需要单独的变量。类似的方法可能会奏效——如果字符串中有空格,您可能需要以不同的方式处理:
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("scan.txt")
if err != nil {
fmt.Println(err)
}
for {
var i int
var flt float64
var str string
var n int
n, err = fmt.Fscanln(f, &str, &flt, &i)
if n == 0 || err != nil {
break
}
fmt.Println("string:", str, "; float:", flt, "; int:", i)
}
}
产出:
string: SomeString ; float: 200 ; int: 2
string: OtherString ; float: 100.6 ; int: 9
string: OneMoreString ; float: 550.8 ; int: 1
这样做可能会奏效——如果字符串中有空格,则可能需要以不同的方式处理:
package main
import (
"fmt"
"os"
)
func main() {
f, err := os.Open("scan.txt")
if err != nil {
fmt.Println(err)
}
for {
var i int
var flt float64
var str string
var n int
n, err = fmt.Fscanln(f, &str, &flt, &i)
if n == 0 || err != nil {
break
}
fmt.Println("string:", str, "; float:", flt, "; int:", i)
}
}
产出:
string: SomeString ; float: 200 ; int: 2
string: OtherString ; float: 100.6 ; int: 9
string: OneMoreString ; float: 550.8 ; int: 1
比如说,
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Data struct {
AString string
AFloat float64
AnInt int64
}
func ParseLine(line string) (*Data, error) {
data := new(Data)
var err error
text := strings.TrimRight(line, " ")
i := strings.LastIndex(text, " ")
i++
text = text[i:]
data.AnInt, err = strconv.ParseInt(text, 10, 64)
if err != nil {
return nil, err
}
line = line[:i]
text = strings.TrimRight(line, " ")
i = strings.LastIndex(text, " ")
i++
text = text[i:]
data.AFloat, err = strconv.ParseFloat(text, 64)
if err != nil {
return nil, err
}
line = line[:i]
data.AString = line
return data, nil
}
func main() {
f, err := os.Open("data.txt")
if err != nil {
fmt.Fprintln(os.Stderr, "opening input:", err)
return
}
scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := scanner.Text()
data, err := ParseLine(line)
if err != nil {
fmt.Fprintln(os.Stderr, "reading input:", err, ":", line)
continue
}
fmt.Println(*data)
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading input:", err)
}
}
输入(data.txt):
输出:
{Some String 200 2}
{Other String 100.6 9}
{One More String 550.8 1}
比如说,
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Data struct {
AString string
AFloat float64
AnInt int64
}
func ParseLine(line string) (*Data, error) {
data := new(Data)
var err error
text := strings.TrimRight(line, " ")
i := strings.LastIndex(text, " ")
i++
text = text[i:]
data.AnInt, err = strconv.ParseInt(text, 10, 64)
if err != nil {
return nil, err
}
line = line[:i]
text = strings.TrimRight(line, " ")
i = strings.LastIndex(text, " ")
i++
text = text[i:]
data.AFloat, err = strconv.ParseFloat(text, 64)
if err != nil {
return nil, err
}
line = line[:i]
data.AString = line
return data, nil
}
func main() {
f, err := os.Open("data.txt")
if err != nil {
fmt.Fprintln(os.Stderr, "opening input:", err)
return
}
scanner := bufio.NewScanner(f)
for scanner.Scan() {
line := scanner.Text()
data, err := ParseLine(line)
if err != nil {
fmt.Fprintln(os.Stderr, "reading input:", err, ":", line)
continue
}
fmt.Println(*data)
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "reading input:", err)
}
}
输入(data.txt):
输出:
{Some String 200 2}
{Other String 100.6 9}
{One More String 550.8 1}