Преобразование байтового массива в строку - PullRequest
0 голосов
/ 30 апреля 2020

Мое намерение - прочитать текстовый файл и распечатать записи на консоли. Пример текстового файла формата

ab c 123

test zzz

hello world

Я использую байтовый массив для инициализации своей структуры. Однако, когда я пытаюсь печатать после разделения строк чтения, печатаются пустые значения для второго токена, который получен после разделения

  package main 


import (
"fmt"
"bufio"
"os"
"strings"
"io/ioutil"
)

type person struct {
    fName [20]byte
    lName [20]byte
}

func main(){

reader := bufio.NewReader(os.Stdin)

fmt.Printf("Enter Name ")
fname, _ := reader.ReadString('\n')
fname = strings.Replace(fname, "\n", "", -1)
fname = strings.Replace(fname, "\r", "", -1)

readFile, err := ioutil.ReadFile(fname)
 if err != nil {
        panic(err)
    }

s := string(readFile)
fileTextLines := strings.Split(s, "\n")



sli := make([]person, len(fileTextLines))
    for _, eachline := range fileTextLines {
        res1 := strings.Split( eachline, " ")

        var fname [20]byte  

        copy( fname[:], []byte(res1[0] ))
        fmt.Println(string(fname[:]))


        var lname [20]byte  
        copy( lname[:], []byte(res1[1] ) )
        fmt.Println(string(lname[:]))

        p := person{fname ,lname}
        sli = append(sli,p)
    }

// print the slice 

//   for _,object  := range sli {
//       fmt.Printf("First Name: %s Last Name: %s\n", string(object.fName[:]), string(object.lName[:]))
//    }

}

При предложенном подходе я получил следующий вывод

                             Last Name: 123
                             Last Name: zzz

Имя: привет Фамилия: world

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

После того, как вы разделите имя и фамилию, в значениях появятся лишние пробелы, поэтому я добавил strings.TrimSpace и ниже, код работает, а также вам не нужно инициализировать sli с фиксированной длиной, добавление автоматически увеличит размер фрагмента.

package main 

import (
"fmt"
"bufio"
"os"
"strings"
"io/ioutil"
)

type person struct {
    fName [20]byte
    lName [20]byte
}

func main(){

reader := bufio.NewReader(os.Stdin)

fmt.Printf("Enter Name ")
fname, _ := reader.ReadString('\n')
fname = strings.Replace(fname, "\n", "", -1)
fname = strings.Replace(fname, "\r", "", -1)

readFile, err := ioutil.ReadFile(fname)
 if err != nil {
        panic(err)
    }

s := string(readFile)
fileTextLines := strings.Split(s, "\n")



sli := []person{}
    for _, eachline := range fileTextLines {
        res1 := strings.Split( eachline, " ")

        var fname [20]byte  

        copy( fname[:], []byte(strings.TrimSpace(res1[0])))
        fmt.Println(string(fname[:]))


        var lname [20]byte  
        copy( lname[:], []byte(strings.TrimSpace(res1[1])) )
        fmt.Println(string(lname[:]))

        p := person{fname ,lname}
        sli = append(sli,p)
    }

// print the slice 

   for _,object  := range sli {
       fmt.Printf("First Name: %s Last Name: %s\n", string(object.fName[:]), string(object.lName[:]))
    }

}

Только что выяснилось, что лишним с пробелом является возврат каретки "\ r" , Если вы используете windows платформу, вы должны использовать строку ниже, чтобы разделить текст новой строкой

strings.Split(strings.Replace(windows, "\r\n", "\n", -1), "\n")
1 голос
/ 30 апреля 2020

Используйте этот код:

readFile, err := ioutil.ReadFile(fname)
if err != nil {
    panic(err)
}

fileTextLines := bytes.Split(readFile, []byte("\n"))

sli := make([]person, 0, len(fileTextLines))
for _, eachline := range fileTextLines {
    res1 := bytes.Split(eachline, []byte(" "))
    if len(res1) < 2 {
        continue
    }
    var p person
    copy(p.fName[:], res1[0])
    copy(p.lName[:], res1[1])
    sli = append(sli, p)
}

for _, object := range sli {
    fmt.Printf("First Name: %s Last Name: %s\n", object.fName[:], object.lName[:])
}

Это упрощает код, работая с байтом [] вместо строки, и обрабатывает случай, когда строка имеет только один токен.

Пример работы с GoLang PlayGround: https://play.golang.org/p/JFcM1uE3Ywm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...