Ho un file flat che contiene 339276 righe di testo per una dimensione di 62.1 MB. Sto tentando di leggere tutte le righe, analizzarle in base a determinate condizioni che ho e quindi inserirle in un database.Come leggere un file flat grande in Golang
Inizialmente, ho tentato di utilizzare un ciclo bufio.Scan() e bufio.Text() per ottenere la riga ma stavo esaurendo lo spazio del buffer. Sono passato a usare bufio.ReadLine/ReadString/ReadByte (ho provato ciascuno) e ho avuto lo stesso problema con ciascuno. Non avevo abbastanza spazio nel buffer.
Ho provato a utilizzare la lettura e l'impostazione della dimensione del buffer, ma come il documento dice che in realtà è un const che può essere reso più piccolo ma mai più grande di 64 * 1024 byte. Ho quindi provato a utilizzare File.ReadAt in cui ho impostato il postilion di partenza e spostato mentre ho portato in ogni sezione senza alcun risultato. Ho guardato i seguenti esempi e spiegazioni (non un elenco esaustivo):
Read text file into string array (and write) How to Read last lines from a big file with Go every 10 secs reading file line by line in go
Come faccio a leggere in un intero file (sia riga per riga o il tutto in una sola volta) in una fetta quindi posso andare a fare le cose alle linee?
Ecco po 'di codice che ho provato:
file, err := os.Open(feedFolder + value)
handleError(err)
defer file.Close()
// fileInfo, _ := file.Stat()
var linesInFile []string
r := bufio.NewReader(file)
for {
path, err := r.ReadLine("\n") // 0x0A separator = newline
linesInFile = append(linesInFile, path)
if err == io.EOF {
fmt.Printf("End Of File: %s", err)
break
} else if err != nil {
handleError(err) // if you return error
}
}
fmt.Println("Last Line: ", linesInFile[len(linesInFile)-1])
Qui è un'altra cosa ho provato:
var fileSize int64 = fileInfo.Size()
fmt.Printf("File Size: %d\t", fileSize)
var bufferSize int64 = 1024 * 60
bytes := make([]byte, bufferSize)
var fullFile []byte
var start int64 = 0
var interationCounter int64 = 1
var currentErr error = nil
for currentErr != io.EOF {
_, currentErr = file.ReadAt(bytes, st)
fullFile = append(fullFile, bytes...)
start = (bufferSize * interationCounter) + 1
interationCounter++
}
fmt.Printf("Err: %s\n", currentErr)
fmt.Printf("fullFile Size: %s\n", len(fullFile))
fmt.Printf("Start: %d", start)
var currentLine []string
for _, value := range fullFile {
if string(value) != "\n" {
currentLine = append(currentLine, string(value))
} else {
singleLine := strings.Join(currentLine, "")
linesInFile = append(linesInFile, singleLine)
currentLine = nil
}
}
Sono in perdita. O non capisco esattamente come funziona il buffer o non capisco qualcos'altro. Grazie per aver letto.
Non leggere tutto in una volta . Steam it. Usa 'bufio.Scanner' (dato che sembra che indichi che è basato sulla linea), elabora la linea, inserisci nel tuo db, * poi dimentica quella linea *. –
Grazie per la risposta. Come faccio a dimenticare quella linea? Nei miei tentativi di utilizzare bufio.Scanner quando raggiungo la riga 63700 (approssimativamente) nel mio file, interrompo la lettura in nuove righe. La mia comprensione è che è perché ho colpito il MaxScanTokenSize (http://golang.org/pkg/bufio/#pkg-constants) dello scanner.Mi piacerebbe leggere la riga, analizzarla e buttarla via, ma non so come fare a buttarla via così lo scanner continua a muoversi attraverso l'intero file. – rvrtex
@DaveC Hm ... Buffer al vapore. – fuz