Skip to content

part4 - ユーザー情報の表示

前回はコマンドを実装した。これで、createコマンドやreadコマンドを実装できるようになった。

ひとまず、Read.fsを作成し、そこでコマンドを作成してみよう。このコマンドはユーザーからIDの入力を受け付け、そのIDに基づいてcsvファイルを読み込む。存在しないときは、存在しないとコンソールに表示する。あとは読み込んだcsvデータをパースし、正しい情報であればそのまま表示、おかしなデータになっていたらデータが破損している旨を報告する。

Read.fs
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
None

readCsv関数は、引数にファイルパスを受け取り、そのファイルが存在する場合は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の全体図は以下の通りとなる。

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 create
open 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でユーザー情報を表示できるようになった。ただ、createreadも、まだエラーハンドリングが全然できていない。どんな入力も許可されてしまっている。そのあたりを直したいが……ひとまず、updateやdeleteを実装してしまおう。