从exec.Command输出解析整数

时间:2016-06-10 21:57:45

标签: go

我目前正在尝试从Go程序中运行一个命令,并从响应中解析一个整数。该命令返回如下输出:

  

6
  fyb_src / ex1.fyb(1)获胜!

使用strings.Splitstrings.TrimSpaces拆分行并删除空格可以正常工作。但是,在尝试将数字解析为整数时,我收到以下错误:

  

panic:strconv.ParseInt:解析“0 \ r1 \ r2 \ r3 \ r4 \ r5 \ r6”:语法无效

但是打印我正在尝试解析到终端的字符串会产生以下结果:

  

6

我不确定从哪里开始。这个数字对我来说显然是一个整数。错误消息也没用(至少对我而言)。有没有人有想法?

编辑:我正在运行的代码

    out, _ := exec.Command(pwd+"/osx_fukyobrane_amd64", "fyb_src/"+filename, "fyb_src/salty.fyb", "t").CombinedOutput()
    parts := strings.Split(string(out), "\n")

    fmt.Println(parts[0])

    rounds, err := strconv.Atoi(strings.TrimSpace(parts[0]))
    if err != nil {
        panic(err.Error())
    }

3 个答案:

答案 0 :(得分:0)

看起来该行上可能还有一些其他转义数据。尝试按空格分割并使用它。

out, _ := exec.Command(pwd+"/osx_fukyobrane_amd64", "fyb_src/"+filename, "fyb_src/salty.fyb", "t").CombinedOutput()
parts := strings.Split(string(out), "\n")

parts = strings.Split(parts, " ")

fmt.Println(parts[0])

rounds, err := strconv.Atoi(strings.TrimSpace(parts[0]))
if err != nil {
    panic(err.Error())
}

答案 1 :(得分:0)

您的问题似乎是parts[0]包含字符串"0 \r1 \r2 \r3 \r4 \r5 \r6"而不是数字。

strconv.Atoi函数正在寻找一个要解析的数字 - 我假设你在这种情况下试图获得第一个“0”。如果是这样,问题是此代码:strings.Split(string(out), "\n")仅查找“\ n”而非“\ r”,这显然是从osx_fukyobrane_amd64返回的内容。

一种解决方案是将这些行分开:

regexp.MustCompile(`[\r\n]+`).Split(parts[0], -1)

这会将多行合并为一行,并将\ r,\ n和\ r \ n(或其他奇怪的组合)视为有效的换行符。

答案 2 :(得分:0)

使用strings.Fields代替Split,它会自动处理\n\r

这也比使用regexp要快得多,后者在Go中相当慢,尽管它正在改进。

func splitAndTrim(line string) []string {
    out := strings.Fields(line)
    for i, s := range out {
        out[i] = strings.TrimSpace(s)
    }
    return out
}

playground