String Haskell从文件中删除尾随和前导空格

String Haskell从文件中删除尾随和前导空格,string,haskell,io,String,Haskell,Io,假设我有一个文件 mary had a little lamb It's fleece was white as snow Everywhere the child went The lamb, the lamb was sure to go, yeah 如何将文件读取为字符串,并删除尾随和前导空格?它可以是空格或制表符。删除空白后,它将按如下方式打印: mary had a little lamb It's fleece was w

假设我有一个文件

mary had a little lamb
         It's fleece was white as snow    
Everywhere   
    the child went   
   The lamb, the lamb was sure to go, yeah    
如何将文件读取为字符串,并删除尾随和前导空格?它可以是空格或制表符。删除空白后,它将按如下方式打印:

mary had a little lamb
It's fleece was white as snow
Everywhere
the child went
The lamb, the lamb was sure to go, yeah
以下是我目前拥有的:

import Data.Text as T

readTheFile = do
    handle <- openFile "mary.txt" ReadMode
    contents <- hGetContents handle
    putStrLn contents
    hClose handle
    return(contents)

main :: IO ()
main = do
    file <- readTheFile
    file2 <- (T.strip file)
    return()
导入数据。文本为T
readTheFile=do

handle这里有一个可能的解决方案,可以满足您的需求:

import qualified Data.Text as T

main = do
  trimedFile <- (T.unlines . map T.strip . T.lines) <$> T.readFile "mary.txt"
  T.putStr trimedFile
导入符合条件的数据。文本为T
main=do

trimedFile以下是一个可能的解决方案:

import qualified Data.Text as T

main = do
  trimedFile <- (T.unlines . map T.strip . T.lines) <$> T.readFile "mary.txt"
  T.putStr trimedFile
导入符合条件的数据。文本为T
main=do

trimedFile您的代码暗示了对Haskell的一些误解,因此在找到解决方案之前,让我们先看看您的代码

import Data.Text as T
您正在使用
文本
,太棒了!我建议您也使用IO操作来读取和写入
文本
类型,而不是使用prelude提供的操作,prelude在
字符串
s(字符链接列表)上工作。也就是说,
将Data.Text.IO导入为T

readTheFile = do
    handle <- openFile "mary.txt" ReadMode
    contents <- hGetContents handle
    putStrLn contents
    hClose handle
    return(contents)
这里有两个问题

在这里发布一个通知,您使用了
条带
,好像这是一个IO操作。。。但事实并非如此。我建议您更多地了解IO和绑定(do表示法)与let绑定变量
strip
计算类型为
Text
的新值,您可能想用该值做一些有用的事情,比如编写它

问题2剥离整个文件与每次剥离一行不同。我建议你读一下mathk的答案

所以最后我想你想要:

-- Qualified imports are accessed via `T.someSymbol`
import qualified Data.Text.IO as T
import qualified Data.Text as T

-- Not really need as a separate function unless you want to also
-- put the stripping here too.
readTheFile :: IO T.Text
readTheFile = T.readFile "mary.txt"

-- First read, then strip each line, then write a new file.
main :: IO ()
main =
    do file <- readTheFile
       let strippedFile = T.unlines $ map T.strip $ T.lines file
       T.writeFile "newfile.txt" (T.strip strippedFile)
--通过'T.someSymbol'访问符合条件的导入`
将限定的Data.Text.IO作为T导入
导入符合条件的数据。文本为T
--不是真的需要作为一个单独的功能,除非你也想
--把带子也放在这里。
readTheFile::IO T.文本
readTheFile=T.readFile“mary.txt”
--首先读取,然后剥离每一行,然后写入一个新文件。
main::IO()
主要=

do file您的代码表明了对Haskell的一些误解,所以在找到解决方案之前,让我们先看看您的代码

import Data.Text as T
您正在使用
文本
,太棒了!我建议您也使用IO操作来读取和写入
文本
类型,而不是使用prelude提供的操作,prelude在
字符串
s(字符链接列表)上工作。也就是说,
将Data.Text.IO导入为T

readTheFile = do
    handle <- openFile "mary.txt" ReadMode
    contents <- hGetContents handle
    putStrLn contents
    hClose handle
    return(contents)
这里有两个问题

在这里发布一个通知,您使用了
条带
,好像这是一个IO操作。。。但事实并非如此。我建议您更多地了解IO和绑定(do表示法)与let绑定变量
strip
计算类型为
Text
的新值,您可能想用该值做一些有用的事情,比如编写它

问题2剥离整个文件与每次剥离一行不同。我建议你读一下mathk的答案

所以最后我想你想要:

-- Qualified imports are accessed via `T.someSymbol`
import qualified Data.Text.IO as T
import qualified Data.Text as T

-- Not really need as a separate function unless you want to also
-- put the stripping here too.
readTheFile :: IO T.Text
readTheFile = T.readFile "mary.txt"

-- First read, then strip each line, then write a new file.
main :: IO ()
main =
    do file <- readTheFile
       let strippedFile = T.unlines $ map T.strip $ T.lines file
       T.writeFile "newfile.txt" (T.strip strippedFile)
--通过'T.someSymbol'访问符合条件的导入`
将限定的Data.Text.IO作为T导入
导入符合条件的数据。文本为T
--不是真的需要作为一个单独的功能,除非你也想
--把带子也放在这里。
readTheFile::IO T.文本
readTheFile=T.readFile“mary.txt”
--首先读取,然后剥离每一行,然后写入一个新文件。
main::IO()
主要=

然后执行文件读取文件或一次一行处理文件

> intercalate " ".words $ "   The lamb, the lamb    was sure to go, yeah   "
"The lamb, the lamb was sure to go, yeah"

但是,不带参数的
unwords
插入“
更好,而且它也不必导入。

读取文件或一次处理一行文件

> intercalate " ".words $ "   The lamb, the lamb    was sure to go, yeah   "
"The lamb, the lamb was sure to go, yeah"

但是,
unwords
没有参数比
插入“
更好,而且它也不必导入。

你能发布代码吗?我是haskell的新手,不知道有多少人在详细介绍您的代码示例。解释为什么它没有做你想要的。为了帮助你,这是我们必须弄清楚的第一件事,你可以让我们不必从你的代码中推断出来。你能发布代码吗?我是haskell的新手,不知道有多少人在详细介绍您的代码示例。解释为什么它没有做你想要的。为了帮助您,这是我们必须解决的第一件事,您可以避免我们不得不从您的代码中推断出这一点。