{- Copyright (C) 2020 by TADASHI TAKEHANA  配布、配信、公然での口述、販売、改変、をしないでください。 <コマンドプロンプト用プログラム> 情報支援プログラム(※フィルタープログラム)  フィルタープログラムとは、標準入力からデーターを取得して、それを処理した結果を、標準出力から表示して終了するプログラムである。 プログラムファイル名 TjShiensection.hs 著作日時: 2020.08.30.日. 12:25:00 著作者、竹花 忠 ※注.  先頭に--が付いている行は、コメント行です。プログラムのコードではありません。  また、{- と -} で、挟まれた・囲まれた・括られた、範囲もコメントです。プログラムのコードではありません。 ※注.  Haskell言語のソースプログラムのファイルタイプ名は、.hsにしてください。  また、Haskell言語のソースプログラムは、UTF8のコード体系で保存してください。 準備作業:  Haskell言語の開発環境のインストールについては、Haskell Platformをダウンロードします。 http://hackage.haskell.org/platform/から、使用しているOSにあったものをダウンロードしてください。  ダウンロードしたらインストールしましょう。  本プログラムは、フィルタープログラムとして作成してあります。 TjShiensection 検索対象ファイル名 とタイプ入力して改行で起動します。  たとえば、検索対象ファイルの名前がsankakufile.txtであったなら、 TjShiensection sankakufile.txt とタイプ入力して改行で、sankakufile.txtを検索対象ファイルとして、TjShiensectionが起動します。  本プログラムを実行するには、Haskell言語の開発環境をインストールして、本プログラムを、コンパイル、リンク、してください。  本プログラムを、コマンドプロンプトのカレントフォルダーに配置しておけば、コマンドプロンプトで、ghc TjShiensectionとタイプ入力してEnterキーを押すだけで、コンパイル、リンク、が完了します。  コマンドプロンプトのカレントフォルダー以外にプログラムが配置してある場合は、プログラム名の前に、フォルダーを指定するパスの入力が必要になります。  コマンドプロンプトのカレントフォルダーは、コマンドプロンプトのプロンプトの表示でわかります。コマンドプロンプトのプロンプトの表示が、C:\Users\Takehana>となっている場合、カレントフォルダーは、C:\Users\Takehanaです。つまり、Cドライブの下のUsersフォルダーの下のTakehanaフォルダーがカレントフォルダーである、ということです。  そこに、プログラムのソースファイルを配置しておけば、GHC TjShiensectionをタイプ入力して、Enterキーを押すことで、コンパイル、リンク、が終了して実行ファイルが作成されます。  実行ファイルを完成させてから、以下の使用方法の説明にしたがって、プログラムを起動してご使用ください。 使用方法:  本プログラムは、コマンドプロンプトを起動して、実行します。  コマンドプロンプトに、chcp 932を入力して、コードページをShiftJISに設定します。  検索対象文章ファイルのコード体系は、ShiftJISでなければ、このプログラムは正常に動作しません。  ただし、このプログラム自体は、UTF8のコード体系で作成してください。  でもでも、検索対象ファイルは、ShiftJIS・ANSI、のコード体系で保存してください。  本ソースプログラムを、コンパイル、リンクして、実行プログラムを作成してから、コマンドプロンプトから、TjShiensection 検索対象ファイル を入力してEnterキーをタイプすると、本プログラムは起動します。  参考書籍: すごいHaskellたのしく学ぼう! -} -- 以下よりHaskell言語によるプログラムです。 import Data.List import System.IO import System.Directory import System.Environment import Control.Exception import Control.Monad {-概要・予備知識  プログラム起動時、プログラム名の次の引数に、検索対象とするファイルの名前を指定します。  "検索文字列:"のプロンプトに対して、検索対象とするファイル中の1セクションに含まれいる文字列1個をタイプ入力して改行します。  すると、→行以下に、その文字列が含まれているセクションがすべて表示されます。  なお、セクションとは、空行で隔てられた各範囲です。  "検索文字列:"のプロンプトに対して、改行だけを入力すると本プログラムは終了します。 -} main = do args <- getArgs let [targetFile] = args argcnt = length args if argcnt /= 1 then putStrLn "使い方 : \nTjShiensection 検索対象ファイル名" else do contents <- readFile targetFile --targetFileに格納されている名前のファイルから、検索対象コンテンツを取り込む。 let lineContents = lines contents sectionContents = packSections lineContents pickupSectionLoop sectionContents --packSections lineContents packSections :: [String] -> [String] packSections [] = [] packSections lineContents@("":xs) = let (h,t) = break (/= "") lineContents in packSections t packSections lineContents = let (h,t) = break (== "") lineContents in (unlines h) : packSections t --pickupSectionLoop sectionContents pickupSectionLoop :: [String] -> IO () pickupSectionLoop sectionContents = do putStrLn "検索文字列 : " searchString <- getLine --標準入力から、検索文字列を取り込む。 if null searchString then putStrLn "情報支援プログラム:TjShiensectionは、終了しました!!" else do let selectSections = filter (isInfixOf searchString) sectionContents putStrLn "→" mapM_ putStrLn selectSections putStrLn "" pickupSectionLoop sectionContents