【F# + ASP.NET MVC】 FParsec を使用してCSVファイルを読み込むには

◆ 参考

・モナディックなパーサ・コンビネータFParsecを使おう。
・F# でパーサーコンビネータを使った CSV ファイルのパース処理

◆ CSVファイル読み込み

namespace FShapLibrary.Util

open System
open System.IO

// #r "FParsec.dll"
// #r "FParsecCS.dll"
open FParsec

type ParseUtil() = 
  static member ParseCsv(path : string) =
    let quotedChar = noneOf "\"" <|> attempt (pstring "\"\"" >>. preturn '"')
    let quotedCell = pchar '"' >>. manyChars quotedChar .>> pchar '"'
    let cell = quotedCell <|> manyChars (noneOf ",\n")
    let line = sepBy cell (pchar ',')
    let csvFile = sepEndBy line newline

    let cs = 
      use tr = new StreamReader(path)
      tr.ReadToEnd()
      
    let res = run csvFile cs

    match res with
      | Success (v, _, _) -> v
      | Failure (msg, _, _) -> failwith msg

◆ Controller

namespace Sample.Controllers

open System.Web
open System.Web.Mvc

open FShapLibrary.Util

type HomeController() =
    inherit Controller()
    member this.Index() =
        // CSVファイルの読み込み
        let csvFile = base.Server.MapPath("/App_Data/test.csv")
        let csv = ParseUtil.ParseCsvFile(csvFile)
        // View用に [string list list]型
            => [IEnumerable<IEnumerable<string>>]型 へ変換 
        let csv = csv |> Seq.ofList |> Seq.map(fun s -> s |> Seq.ofList)
        this.View(csv) :> ActionResult

◆ View

@model IEnumerable<IEnumerable<string>>

@{ Layout = null; }

<!DOCTYPE html>
<html>
<head>
    <title>F# + ASP.NET</title>
</head>
<body>
    <div>
        <table>
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th>Password</th>
            </tr>
            @foreach (var items in Model)
            {
            <tr>
                @foreach (var item in items)
                {
                <td>@Html.DisplayFor(modelItem => item)</td>
                }
            </tr>
            }
        </table>
    </div>
</body>
</html>

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中