web-dev-qa-db-fra.com

Golang: problèmes de remplacement des sauts de ligne dans une chaîne à partir d'un fichier texte

J'ai essayé d'avoir un fichier à lire, qui mettra ensuite le matériel lu dans une chaîne. Ensuite, la chaîne sera divisée par ligne en plusieurs chaînes:

absPath, _ := filepath.Abs("../Go/input.txt")
data, err := ioutil.ReadFile(absPath)
if err != nil {
    panic(err)
}
input := string(data)

Le fichier input.txt se lit comme suit:

une

petit oiseau fort

avec un très

grand coeur

est allé

à l'école un jour et

oublié sa nourriture à

accueil

Cependant,

re = regexp.MustCompile("\\n")
input = re.ReplaceAllString(input, " ")

transforme le texte en un gâchis mutilé de:

homeot sa nourriture atand

Je ne sais pas comment le remplacement des sauts de ligne peut gâcher si mal au point où le texte s'inverse

15
Orange Receptacle

Je suppose que vous exécutez le code sous Windows. Notez que si vous imprimez la longueur de la chaîne résultante, elle affichera quelque chose de plus de 100 caractères. La raison en est que Windows utilise non seulement des retours à la ligne (\n) mais aussi les retours chariot (\r) - donc une nouvelle ligne dans Windows est en fait \r\n, ne pas \n. Pour les filtrer correctement hors de votre chaîne, utilisez:

re = regexp.MustCompile(`\r?\n`)
input = re.ReplaceAllString(input, " ")

Les backticks vous assureront que vous n'avez pas besoin de citer les barres obliques inverses dans l'expression régulière. J'ai utilisé le point d'interrogation pour le retour chariot pour m'assurer que votre code fonctionne également sur d'autres plates-formes.

24
Jens Grabarske

Je ne pense pas que vous ayez besoin d'utiliser l'expression régulière pour une tâche aussi simple. Cela peut être réalisé avec juste

absPath, _ := filepath.Abs("../Go/input.txt")
data, _ := ioutil.ReadFile(absPath)
input := string(data)
strings.Replace(input, "\n","",-1)

example of removing \n

3
Salvador Dali