Как мне написать в текстовом файле, когда я создал файл - PullRequest
0 голосов
/ 17 декабря 2018

я впервые здесь пишу.Я новичок в f # и хотел получить помощь.Я создал программу, которая должна вынимать слова из существующего текстового файла, редактировать его и записывать в новый текстовый файл, по порядку наиболее часто встречающихся слов.Я сделал больше всего, но когда появляется текстовый файл, но внутри него написано:

System.Tuple`2 [System.String, System.Int32] []

Вот мой код:

let reg = RegularExpressions.Regex "\s+" 
let cleanEx = RegularExpressions.Regex "[\,\.\!\"\:\;\?\-]" 
let read = (File.OpenText "clep.txt").ReadToEnd() 
let clen = (cleanEx.Replace(read, "")).ToLower() 

let clean = reg.Split(clen)
let finAr = Array.countBy id clean
let finlist = Array.sortByDescending (fun (_, count) -> count) finAr
// printfn "%A" finlist


let string = finlist.ToString()
let writer = File.AppendText("descend.txt")
writer.WriteLine(finlist);
writer.Close();

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Почему вы видите?

System.Tuple`2 [System.String, System.Int32] []

Поскольку finAr является массивомкортежи (string*int) и finlist - это массив одинаковых элементов, но упорядоченный по количеству.Когда вы делаете finlist.ToString(), это не дает вам строковое представление элементов массива.ToString() по умолчанию (если не переопределено) возвращать полное имя типа объекта.Какой массив кортежей в вашем случае.

Теперь, что вам нужно для записи файла слов в частотном порядке?Просто сопоставление элементов массива со строками:

let lines =
   clean
   |> Array.countBy id // finAr
   |> Array.sortByDescending (fun (_,count) -> count) // finlist
   |> Array.map (fun (word, _) -> word) // here mapping each tuple to string

File.WriteAllLines("descent.txt", lines)

С помощью пары оболочек вы можете передавать операции, связанные с чтением файла и записью в файл:

"clep.txt"
|> readTextFile
|> getWordsMostFrequestFirst
|> writeLinesToFile "descent.txt"

Оболочки:

let readTextFile (path: string) =
    (File.OpenText path).ReadToEnd()

let writeLinesToFile (path: string) (contents: string seq) =
    File.WriteAllLines(path, contents)

И функция, которая обрабатывает текст:

let getWordsMostFrequestFirst (text: string) =
    let splitByWhitespaces (input: string) = Regex.Split(input, "\s+")
    let toLower (input: string) = input.ToLower()
    let removeDelimiters (input: string) = Regex.Replace(input, "[\,\.\!\"\:\;\?\-]", "")

    text
    |> removeDelimiters
    |> toLower
    |> splitByWhitespaces
    |> Array.countBy id
    |> Array.sortByDescending snd // easy way to get tuple items
    |> Array.map fst
0 голосов
/ 17 декабря 2018

Вы записываете в файл только одну строку текста, и поскольку finlist не является типом, для которого StreamWriter.WriteLine() имеет определенную перегрузку, он обрабатывается как object, а используемая строка являетсярезультат finlist.ToString(), который, как обычно со встроенными типами .NET, является просто именем типа.

Если вы хотите записать фактические элементы массива в файл, вам нужно на самом делеобработать массив.

Это запишет части строк из всех кортежей в текстовый файл:

finlist
|> Array.map fst
|> Array.iter writer.WriteLine

Чтобы включить числа, например, в формате «текст: 1»,вам нужно было бы сначала создать соответствующим образом отформатированную строку для каждого элемента массива:

finlist
|> Array.map (fun (text, number) -> sprintf "%s: %i" text number)
|> Array.iter writer.WriteLine

Кстати, из-за того, что строки .NET используют \ для экранирования символов, как это делают регулярные выражения, вашRegExes не будет работать так, как вы их написали.Это должно быть

let reg = RegularExpressions.Regex @"\s+"
let cleanEx = RegularExpressions.Regex @"[\,\.\!\""\:\;\?\-]"

Здесь есть два изменения: @ перед строками говорит компилятору не использовать \ для экранирования символов (в качестве альтернативы вы можете записать каждый обратный слеш в RegEx как \\, но это не делает его более читабельным).В середине второго другого " экранирует двойные кавычки, потому что в противном случае они теперь заканчивали бы строку, и строка больше не компилировалась бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...