it-swarm.com.de

Wie kann ich eine ganze Datei in eine Stringvariable einlesen?

Ich habe viele kleine Dateien, ich möchte sie nicht Zeile für Zeile lesen.

Gibt es in Go eine Funktion, die eine ganze Datei in eine String-Variable einliest?

115
MrROY

Verwenden Sie ioutil.ReadFile :

func ReadFile(filename string) ([]byte, error)

ReadFile liest die nach Dateiname benannte Datei und gibt den Inhalt zurück. Ein erfolgreicher Anruf gibt err == nil zurück, nicht err == EOF. Da ReadFile die gesamte Datei liest, wird .__ nicht behandelt. ein EOF von Read als zu meldender Fehler.

Sie erhalten einen []byte anstelle einer string. Es kann konvertiert werden, wenn really notwendig ist:

s := string(buf)
185
zzzz

Wenn Sie nur wünschen, dass der Inhalt string ist, besteht die einfache Lösung darin, die ReadFile-Funktion aus dem io/ioutil-Paket zu verwenden. Diese Funktion gibt ein Stück von bytes zurück, das Sie leicht in eine string konvertieren können.

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    b, err := ioutil.ReadFile("file.txt") // just pass the file name
    if err != nil {
        fmt.Print(err)
    }

    fmt.Println(b) // print the content as 'bytes'

    str := string(b) // convert content to a 'string'

    fmt.Println(str) // print the content as a 'string'
}
30
openwonk

Ich denke, das Beste, was Sie tun können, wenn Sie wirklich über die Effizienz der Verkettung all dieser Dateien besorgt sind, ist, sie alle in den gleichen Byte-Puffer zu kopieren.

buf := bytes.NewBuffer(nil)
for _, filename := range filenames {
  f, _ := os.Open(filename) // Error handling elided for brevity.
  io.Copy(buf, f)           // Error handling elided for brevity.
  f.Close()
}
s := string(buf.Bytes())

Dadurch wird jede Datei geöffnet, der Inhalt wird in buf kopiert und anschließend wird die Datei geschlossen. Abhängig von Ihrer Situation müssen Sie sie möglicherweise nicht wirklich konvertieren. In der letzten Zeile wird nur angezeigt, dass buf.Bytes () die Daten enthält, nach denen Sie suchen.

13
Running Wild

So habe ich es gemacht:

package main

import (
  "fmt"
  "os"
  "bytes"
  "log"
)

func main() {
   filerc, err := os.Open("filename")
   if err != nil{
     log.Fatal(err)
   }
   defer filerc.Close()

   buf := new(bytes.Buffer)
   buf.ReadFrom(filerc)
   contents := buf.String()

   fmt.Print(contents) 

}    
2
Mo-Gang

Ich habe keinen Computer, also schreibe ich einen Entwurf. Sie könnten sich von dem, was ich sage, frei sein.

func main(){
    const dir = "/etc/"
    filesInfo, e := ioutil.ReadDir(dir)
    var fileNames = make([]string, 0, 10)
    for i,v:=range filesInfo{
        if !v.IsDir() {
            fileNames = append(fileNames, v.Name())
        }
    }

    var fileNumber = len(fileNames)
    var contents = make([]string, fileNumber, 10)
    wg := sync.WaitGroup{}
    wg.Add(fileNumber)

    for i,_:=range content {
        go func(i int){
            defer wg.Done()
            buf,e := ioutil.Readfile(fmt.Printf("%s/%s", dir, fileName[i]))
            defer file.Close()  
            content[i] = string(buf)
        }(i)   
    }
    wg.Wait()
}
0
fwhez