效果:
*Funs> select (from "/home/march/temp/text/\\.(tex|csv)$") >>= whereLines "end" ["\\end{center}","\\end{document}"]代码:
module Funs where import Data.List import Monad import System.Directory import System.FilePath import System.IO import Text.Regex.PCRE data Store t p = Text p | Csv p | Bin p | File p selectFrom (Text store) = do content <- readFile store return$lines content unionIt :: IO [[String]] -> IO[String] unionIt = liftM concat select :: IO [FilePath] -> IO [String] select paths = paths >>= \ps -> unionIt(filterM doesFileExist ps >>= mapM (\p -> selectFrom (Text p))) from :: FilePath -> IO [FilePath] from path = let (dir, files) = splitFileName path in liftM(\lines->[dir++line | line <- lines, line=~files]) ((getDirectoryContents.takeDirectory) dir) whereLines :: String -> [String] -> IO [String] whereLines reg lines = return $filter (\line -> line =~ reg :: Bool) lines这段代码已经包含了基本的 select from where 模式,甚至可以说已经是一个实 用的实现,但是对于我来说,期待它有进一步的功能:
- 有真正的前端脚本
- 可以在 select 后设定输出字段,如匹配文件字和行号,以及进一步用正则对行 文件分组
- 将 where 嵌入 select 过程,真正实现流式过滤
- 支持 limit offset
- 支持CSV
- 支持 group by … having
- 支持 order by
1 条评论:
java编程语言示例
java编程请求授权头
发表评论