2016-11-02 1 views
1
open System 
//helpfunction 
let fileReplace filename needle replace = 
    let replaceIn (reader:System.IO.StreamReader) needle (replace: String) = 
    while not(reader.EndOfStream) do 
     let mutable allText = reader.ReadToEnd() 
     allText <- allText.Replace(needle, replace) 
    reader.Close() 

    //start 
    let reader = System.IO.File.OpenText filename 
    let newText = replaceIn reader needle replace 
    let writer = System.IO.File.CreateText filename 
    writer.Write newText ; writer.Close() 

// testing 
let filename = @".\abc.txt" 
let needle = "med" 
let replace = "MED" 
fileReplace filename needle replace 

J'ai expérimenté un groupe en mouvement reader.Close() autour, mais pas encore de résultats. Je sais que si j'insère printfn "%A" allText sous reader.Close(), il imprime le résultat correct, donc je suppose que c'est quand j'appelle l'auteur que ça va mal. J'ai besoin du code pour remplacer med, avec MED dans abc.txt. mais à la place il laisse un abc.txt videF # - fileReplace, mots txt écraser, mais lors de l'exécution elle écrasera exisiting contenu dans txt

Répondre

2

La fonction replaceIn que vous avez écrite ne fait rien. Séparons ceci:

let replaceIn (reader:System.IO.StreamReader) needle (replace: string) = 
    while not(reader.EndOfStream) do 
     let mutable allText = reader.ReadToEnd() 
     allText <- allText.Replace(needle, replace) 
    reader.Close() 

D'abord, regardez le type de cette fonction:

val replaceIn : reader:System.IO.StreamReader -> needle:string -> replace:string -> unit 

La première chose à noter est que cette fonction retourne unit, cela signifie newText a toujours une valeur de () , quel que soit le contenu du fichier. Cela signifie que vous n'écrivez toujours rien dans votre fichier.

De plus, votre boucle est superflue. Vous lisez à la fin du flux encore en boucle jusqu'à la fin du flux - cette boucle est inutile. De toute façon, il n'y a aucun moyen d'observer les résultats de la boucle car la variable mutable que vous créez pour stocker le résultat est à l'intérieur de la boucle.


Alors, regardons une alternative:

let fileReplace filename (needle : string) (replace : string) = 
    let allText = System.IO.File.ReadAllText filename 
    let newText = allText.Replace(needle, replace) 
    System.IO.File.WriteAllText(filename, newText) 

Comme vous pouvez le voir, vous ne même pas besoin de créer les lecteurs, vous pouvez seulement les fonctions d'aide à System.IO.File.