0

我试图弄清楚为什么我的代码不起作用。我希望取一片数字和字符串,并将其分成三片。对于切片中的每个元素,如果是字符串,则将其附加到字符串切片,如果是正数,则将其附加到正数,负数也一样。然而,这是输出

名称:EvTremblay 45.39934611083154 -75.71148292845268

[Crestview -75.73795670904249 BellevueManor -75.73886856878032 Dutchie'sHole -75.66809864107668 ...

正面:[45.344387632924054 45.37223315413918 ...] 负面:[]

这是我的代码。有人能告诉我是什么导致 Negatives 数组没有任何值吗?

func main() {
    fmt.Printf("%q\n", strings.Split("a,b,c", ","))
    var names []string
    var positives, negatives []float64
    bs, err := ioutil.ReadFile("poolss.txt")
    if err != nil {
        return
    }
    str := string(bs)
    fmt.Println(str)
    tokens := strings.Split(str, ",")
    for _, token := range tokens {
        if num, err := strconv.ParseFloat(token, 64); err == nil {
            if num > 0 {
                positives = append(positives, num)
            } else {
                negatives = append(negatives, num)
            }

        } else {
            names = append(names, token)
        }

    fmt.Println(token)
    }

    fmt.Println(fmt.Sprintf("Strings: %v",names))
    fmt.Println(fmt.Sprintf("Positives: %v", positives))
    fmt.Println(fmt.Sprintf("Negatives: %v",negatives))
    for i := range names{
        fmt.Println(names[i])

        fmt.Println(positives[i])

        fmt.Println(negatives[i])
    }
}
4

3 回答 3

2

您的代码具有strings变量名称:

var strings []string

strings作为包名:

tokens := strings.Split(str, ",")

不要那样做!

strings.Split undefined (type []string has no field or method Split)

游乐场: https: //play.golang.org/p/HfZGj0jOT-P

于 2018-04-15T15:23:43.997 回答
1

我认为您上面的问题可能在于附加到每个浮点数的额外 \n 可能 - 如果您以换行符结尾,您不会得到负条目,或者如果最后没有换行符,您会得到一个。所以插入一个 printf 以便你可以看到你从 strconv.ParseFloat 得到的错误,一切都会变得清晰。

一些可能有帮助的小点:

  • 检查错误,不要只依赖一种类型的错误(这就是让您感到困惑的地方) - 如果错误出现,请始终打印错误,尤其是在调试时
  • 不要将包的名称用于变量(字符串),它不会很好地结束
  • 使用反映您的数据的数据结构
  • 使用 CSV 包读取 CSV 数据

例如,用于存储您可能想要的数据:

type Place struct {
   Name string 
   Latitude int64
   Longitude int64
}

然后根据 cols 的给定顺序将数据读入其中,并将其存储在 []Place 中。

于 2018-04-15T15:37:06.233 回答
0

这是我尝试过的,现在可以了!谢谢大家的帮助!

func main() {
findRoute("poolss.csv", 5)
 }

func findRoute( filename string, num int) []Edge {
var route []Edge
csvFile, err := os.Open(filename)
if err != nil {
    return route
}
reader := csv.NewReader(bufio.NewReader(csvFile))
var pools []Pool
for {
    line, error := reader.Read()
    if error == io.EOF {
        break
    } else if error != nil {
        log.Fatal(error)
    }
    lat, err := strconv.ParseFloat(line[1], 64)
    long, err := strconv.ParseFloat(line[2], 64)
    if err == nil {
        pools = append(pools, Pool{
            name: line[0],
            latitude:  lat,
            longitude: long,
        })
    }
}
return route
}
于 2018-04-15T19:55:36.470 回答