la lecture du fichier ligne par ligne en aller
Je suis incapable de trouver file.ReadLine
fonction en Aller. Je peux comprendre rapidement comment écrire une, mais je me demandais si je suis donnant sur quelque chose ici. Comment lire un fichier ligne par ligne?
- Comme de Go1.1, bufio.Le Scanner est le meilleur moyen pour ce faire.
Vous devez vous connecter pour publier un commentaire.
Il y a de la fonction ReadLine dans le paquet
bufio
.Veuillez noter que si la ligne ne rentre pas dans la mémoire tampon de lecture, la fonction retournera un incomplètes ligne. Si vous voulez toujours de lire une ligne entière dans votre programme par un seul appel à une fonction, vous aurez besoin d'encapsuler le
ReadLine
fonction dans votre propre fonction qui appelleReadLine
dans une boucle for.bufio.ReadString('\n')
n'est pas tout à fait équivalente àReadLine
parce queReadString
est incapable de gérer le cas lors de la dernière ligne d'un fichier ne se termine pas avec le caractère de saut de ligne.En Aller 1.1 et plus récente de la façon la plus simple de le faire est avec un
bufio.Scanner
. Voici un exemple simple qui lit les lignes d'un fichier:C'est la façon la plus propre de lire à partir d'un
Reader
ligne par ligne.Il y a une mise en garde: Scanner ne traite pas bien les lignes de plus de 65536 caractères. Si c'est un problème pour vous, alors vous devriez probablement à rouler sur le dessus de
Reader.Read()
.file, _ := os.Open("/path/to/file.csv")
puis de balayage sur le descripteur de fichier:scanner := bufio.NewScanner(file)
defer file.Close()
.bufio.ErrTooLong
erreur, qui estbufio.Scanner: token too long
si la ligne est trop longue. Dans ce cas, vous devrez utiliser bufio.ReaderLine() ou ReadString().Utilisation:
reader.ReadString('\n')
\n
à la fin de la chaîne de caractères retournée.reader.ReadLine()
J'ai testé les différentes solutions proposées par l'écriture d'un programme pour tester les scénarios qui sont identifiés comme des problèmes dans d'autres réponses:
J'ai constaté que:
Scanner
solution ne permet pas de gérer de longues lignes.ReadLine
solution est complexe à mettre en œuvre.ReadString
solution est la plus simple et fonctionne pour les lignes longues.Voici le code qui démontre chaque solution, il peut être exécuté via
go run main.go
:J'ai testé sur:
Le programme de test de sortie:
defer file.Close()
devrait être après la vérification d'erreur; sinon, en cas d'erreur, il va paniquer.EDIT: Comme de go1.1, la idiomatiques solution est d'utiliser bufio.Scanner
J'ai écrit un moyen facile de lire chaque ligne d'un fichier. Le Readln(*bufio.Lecteur), la fonction retourne une ligne (sans \n) de la sous-jacentes bufio.Lecteur struct.
Vous pouvez utiliser Readln de lire chaque ligne d'un fichier. Le code suivant lit chaque ligne d'un fichier et de sorties de chaque ligne sur la sortie standard stdout.
Cheers!
Il y a deux façon de lire le fichier ligne par ligne.
Dans mon cas de test, ~250 MO, ~de 2 500 000 lignes, bufio.Scanner(temps utilisé: 0.395491384 s) est plus rapide que bufio.Reader.ReadString(time_used: 0.446867622 s).
Code Source: https://github.com/xpzouying/go-practice/tree/master/read_file_line_by_line
Lire fichier utiliser bufio.Scanner,
Lire fichier utiliser bufio.Lecteur,
bufio.Reader
exemple ne sera pas lu la dernière ligne d'un fichier si le fichier ne se termine pas par un saut de ligne.ReadString
sera de retour à la fois la dernière ligne etio.EOF
dans ce cas.Vous pouvez également utiliser ReadString avec \n comme un séparateur:
Exemple de ce gist
mais cela donne une erreur quand il y a une ligne de plus de Scanner de mémoire tampon.
Quand c'est arrivé, ce que je faire est d'utiliser
reader := bufio.NewReader(inFile)
créer et concat mon propre tampon, soit à l'aide dech, err := reader.ReadByte()
oulen, err := reader.Read(myBuffer)
-1
?bufio.Reader.ReadLine() fonctionne bien. Mais si vous voulez lire chaque ligne par une chaîne de caractères, essayez d'utiliser ReadString('\n'). Il n'a pas besoin de réinventer la roue.
Dans le code ci-dessous, j'ai lu les intérêts à partir de la CLI, jusqu'à ce que l'utilisateur appuie sur entrée et je suis en utilisant Readline:
Voici un exemple avec la fonction
ReadFromStdin()
c'est commefmt.Scan(&name)
mais sa prend toutes les chaînes de caractères avec des espaces comme: "Bonjour, Mon Nom Est ..."J'aime Lzap solution, je suis nouveau dans le jeu de Go,
Je woud comme de demander à lzap mais je ne pouvais pas le faire, je n'ai pas 50 points encore..
Je change un peu de votre solution et de compléter le code...
Je ne sais pas pourquoi j'ai besoin de tester 'err' de nouveau, mais de toute façon, nous pouvons le faire.
Mais, la question principale est de savoir..
pourquoi Aller ne produisent pas d'erreur avec la phrase
=> ligne, err := r.ReadString(10), à l'intérieur de la boucle ?
Il est défini encore et encore à chaque fois que la boucle est exécutée.
- Je éviter cette situation avec mon changement, un commentaire?
J'ai mis la condition expressions du FOLKLORE dans les "pour" comme un temps trop.
Grâce