{- Copyright (C) 2020 by TADASHI TAKEHANA  配布、配信、公然での口述、販売、改変、をしないでください。 <コマンドプロンプト用プログラム> 情報支援プログラム(※フィルタープログラム)  フィルタープログラムとは、標準入力からデーターを取得して、それを処理した結果を、標準出力から表示して終了するプログラムである。 プログラムファイル名 TjShien01.hs 著作日時: 2020.07.25.土. 22:30:00 著作者、竹花 忠 著作者、竹花 忠 ※注.  先頭に--が付いている行は、コメント行です。プログラムのコードではありません。  また、{- と -} で、挟まれた・囲まれた・括られた、範囲もコメントです。プログラムのコードではありません。 ※注.  Haskell言語のソースプログラムのファイルタイプ名は、.hsにしてください。  また、Haskell言語のソースプログラムは、UTF8のコード体系で保存してください。 準備作業:  Haskell言語の開発環境のインストールについては、Haskell Platformをダウンロードします。 http://hackage.haskell.org/platform/から、使用しているOSにあったものをダウンロードしてください。  ダウンロードしたらインストールしましょう。  本プログラムは、フィルタープログラムとして作成してあります。 TjShien01 検索対象ファイル名 とタイプ入力して改行で起動します。  たとえば、検索対象ファイルの名前がsankakufile.txtであったなら、 TjShien01 sankakufile.txt とタイプ入力して改行で、sankakufile.txtを検索対象ファイルとして、TjShien01が起動します。  本プログラムを実行するには、Haskell言語の開発環境をインストールして、本プログラムを、コンパイル、リンク、してください。  本プログラムを、コマンドプロンプトのカレントフォルダーに配置しておけば、コマンドプロンプトで、ghc TjShien01とタイプ入力してEnterキーを押すだけで、コンパイル、リンク、が完了します。  コマンドプロンプトのカレントフォルダー以外にプログラムが配置してある場合は、プログラム名の前に、フォルダーを指定するパスの入力が必要になります。  コマンドプロンプトのカレントフォルダーは、コマンドプロンプトのプロンプトの表示でわかります。コマンドプロンプトのプロンプトの表示が、C:\Users\Takehana>となっている場合、カレントフォルダーは、C:\Users\Takehanaです。つまり、Cドライブの下のUsersフォルダーの下のTakehanaフォルダーがカレントフォルダーである、ということです。  そこに、プログラムのソースファイルを配置しておけば、GHC TjShien01をタイプ入力して、Enterキーを押すことで、コンパイル、リンク、が終了して実行ファイルが作成されます。  実行ファイルを完成させてから、以下の使用方法の説明にしたがって、プログラムを起動してご使用ください。 使用方法:  本プログラムは、コマンドプロンプトを起動して、実行します。  コマンドプロンプトに、chcp 932を入力して、コードページをShiftJISに設定します。  検索対象文章ファイルのコード体系は、ShiftJISでなければ、このプログラムは正常に動作しません。  ただし、このプログラム自体は、UTF8のコード体系で作成してください。  でもでも、検索対象ファイルは、ShiftJIS・ANSI、のコード体系で保存してください。  本ソースプログラムを、コンパイル、リンクして、実行プログラムを作成してから、コマンドプロンプトから、TjShien01 検索対象ファイル を入力して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 "使い方 : \nTjShien01 検索対象ファイル名" else do contents <- readFile targetFile --targetFileに格納されている名前のファイルから、検索対象コンテンツを取り込む。 let lineContents = lines contents pickupLineLoop lineContents --pickupLineLoop lineContents pickupLineLoop :: [String] -> IO () pickupLineLoop lineContents = do putStrLn "検索文字列 : " searchString <- getLine --標準入力から、検索文字列を取り込む。 if null searchString then putStrLn "情報支援プログラム:TjShien01は、終了しました!!" else do let selectLines = filter (isInfixOf searchString) lineContents putStrLn "→" mapM_ putStrLn selectLines putStrLn "" pickupLineLoop lineContents