part4 - ユーザー情報の表示
前回はコマンドを実装した。これで、createコマンドやreadコマンドを実装できるようになった。
ひとまず、Read.fsを作成し、そこでコマンドを作成してみよう。このコマンドはユーザーからIDの入力を受け付け、そのIDに基づいてcsvファイルを読み込む。存在しないときは、存在しないとコンソールに表示する。あとは読み込んだcsvデータをパースし、正しい情報であればそのまま表示、おかしなデータになっていたらデータが破損している旨を報告する。
let read = System.Console.Clear() printfn "ID を入力してください。" let id = System.Console.ReadLine() let path = System.IO.Path.Combine("./users", id + ".csv")read関数は、createのときと同じようにコンソールをクリアし、IDの入力を受け付ける。その後、./users/[ID].csvのパスを作成する。
次に、csvを読み取る関数を考える。
let readCsv path = if System.IO.File.Exists(path) then let csvData = System.IO.File.ReadAllText(path) let values = csvData.Split(',') Some values else NonereadCsv関数は、引数にファイルパスを受け取り、そのファイルが存在する場合はcsvデータを読み取り、カンマで分割して返す。存在しない場合はNoneを返す。本当は、読み取ったあとに正しい形式か否かをチェックするべきだが、今回は省略する。
最後に、read関数を完成させる。
let read = System.Console.Clear() printfn "ID を入力してください。" let id = System.Console.ReadLine() let path = System.IO.Path.Combine("./users", id + ".csv")
match readCsv path with | Some values -> let id = values.[0] let name = values.[1] let age = values.[2] let email = values.[3] printfn "ID: %s" id printfn "名前: %s" name printfn "年齢: %s" age printfn "メールアドレス: %s" email | None -> printfn "ユーザーが見つかりませんでした。"read関数は、readCsv関数を使ってcsvデータを読み取り、ユーザーの情報を表示する。存在しない場合は、ユーザーが見つからなかった旨を表示する。
Read.fsの全体図は以下の通りとなる。
module read
let readCsv path = if System.IO.File.Exists(path) then let csvData = System.IO.File.ReadAllText(path) let values = csvData.Split(',') Some values else None
let read = System.Console.Clear() printfn "ID を入力してください。" let id = System.Console.ReadLine() let path = System.IO.Path.Combine("./users", id + ".csv")
match readCsv path with | Some values -> let id = values.[0] let name = values.[1] let age = values.[2] let email = values.[3] printfn "ID: %s" id printfn "名前: %s" name printfn "年齢: %s" age printfn "メールアドレス: %s" email | None -> printfn "ユーザーが見つかりませんでした。"それでは、このread関数をfsprojファイルに追加しよう。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net9.0</TargetFramework> </PropertyGroup>
<ItemGroup> <Compile Include="Create.fs" /> <Compile Include="Read.fs" /> <Compile Include="Program.fs" /> </ItemGroup>
</Project>そしてProgram.fsにコマンドを追加しよう。
open createopen read // 追加
type Command = | Create | Read | Help | Unknown of string
let parseCommand args = match args with | [| "create" |] -> Create | [| "read" |] -> Read | [| "--help" |] -> Help | [| "-h" |] -> Help | [||] -> Help // コマンドがないときもヘルプを表示 | _ -> Unknown args.[0]
let showHelp = printfn "Usage: dotnet run [command]" printfn "Commands:" printfn " create Create a new user" printfn " read <ID> Read a user by ID" printfn " update Update a user by ID" printfn " delete Delete a user by ID" printfn " list List all users" printfn " --help, -h Show this help"
[<EntryPoint>]let main argv = let command = parseCommand argv
match command with | Create -> create | Read -> read // 追加 | Help -> showHelp | Unknown s -> printfn "Unknown command: %s" s
0これで、dotnet run readでユーザー情報を表示できるようになった。ただ、createもreadも、まだエラーハンドリングが全然できていない。どんな入力も許可されてしまっている。そのあたりを直したいが……ひとまず、updateやdeleteを実装してしまおう。