2015-12-05 37 views
5

Ho cercato di leggere un file, che quindi inserirà il materiale letto in una stringa. Poi la stringa sarà ottenere raggruppati per linea in più stringhe:Golang: problemi in sostituzione di una nuova stringa in una stringa da un file di testo

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

L'input.txt viene letto come:

un

forte uccellino

con un molto

grande cuore

andato

a scuola un giorno e

dimenticato il suo cibo a

casa

Tuttavia,

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

trasforma il testo in un pasticcio maciullato di:

homeot suo cibo ATAND

io non sono sicuro di come la sostituzione a capo può rovinare così male al punto in cui il testo stesso inverte

risposta

9

Credo che si esegue il codice utilizzando Windows. Osservare che se si stampa la lunghezza della stringa risultante, mostrerà qualcosa di oltre 100 caratteri. Il motivo è che Windows utilizza non solo i newline (\n) ma anche i ritorni a capo (\r), quindi una nuova riga in Windows è in realtà \r\n, non \n. Per loro filtrare correttamente fuori della stringa, utilizzare:

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

Gli apici inversi farà in modo che non è necessario citare le barre inverse nell'espressione regolare. Ho usato il punto interrogativo per il ritorno a capo per assicurarmi che il tuo codice funzioni anche su altre piattaforme.

1

Non penso che sia necessario utilizzare regex per un compito così facile. Ciò può essere ottenuto con un solo

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

example of removing \n

+1

Che non risolverebbe il problema, però, dal momento che - come detto Jens - a capo di Windows ('\ r \ n ') stanno causando l'effetto descritto quando solo il '\ n' viene sostituito lasciando il' \ r' nella stringa. – madsen

+3

@madsen hai pensato che se '\ r \ n' sta causando un problema, potrebbe essere opportuno rimuovere' \ r \ n'? O sta sostituendo la riga 'strings.Replace (input," \ n "," ", - 1)' a 'strings.Replace (input," \ r \ n "," ", - 1)' un compito impossibile per tu? –

+2

Nessun motivo per diventare aggressivi. Il tuo punto sul non necessariamente bisogno di regex va bene, ma la tua risposta non aiuta OP a risolvere il suo problema reale. – madsen