File 使用GoLang从文件中读取字符串、整数和双精度

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"

当我的数据文件如下所示时,如何从Google Go中的文件读取数据:

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}