スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

どう書く?org F# タブ区切りデータの処理

「どう書く?org」http://ja.doukaku.org/に挑戦8問目です。 
さて今回の問題は次のような内容。 

(問題) http://ja.doukaku.org/209/
 
タブ区切りのデータを読み込んで操作をし書き出す方法を教えてください。読み込み・書き出しの方法は任意とします。
 
与えられるデータは:
 
?レコードの区切りは改行、カラムの区切りはタブです。
?最初のレコードはヘッダで、カラムの名前が書いてあります。
?それ以降はデータで、第1,4カラムは整数値、第2,3カラムは文字列値です。
この入力データに対して以下の操作をしたものを書き出してください:
 
?第1カラムの値でデータを昇順にソートする。
?第2カラムと第3カラムをヘッダを含めて入れ替える。
?第4カラムの値にそれぞれ1を加える。
入力の例:
 
ID      Surname Forename        Age
1       Sato    Hanako  17
0       Suzuki  Taro    18
...
出力の例:
 
ID      Forename        Surname Age
0       Taro    Suzuki  19
1       Hanako  Sato    18
...
 
Personクラスを定義して、それのインスタンスを作って、それのリストをソートするという、いらぬ手間をかけたコードを書いてみました。
 
コードは下の通りです。
 
let inputFileName = @"s:\inputData.txt"
let outputFileName = @"s:\outputData.txt"
 
type Person (st:string[]) =
    member this.id = System.Int32.Parse st.[0]
    member this.age = (System.Int32.Parse  st.[3]) + 1
    member this.toFormat () =
        this.id.ToString() + "\t" + st.[1] + "\t" + st.[2] + "\t" + this.age.ToString() 
 
let splitReplaceToArr (str:string) =
    let strArr = str.Split([|'\t'|])
    [|strArr.[0];strArr.[2];strArr.[1];strArr.[3]|]
 
let linesReadRepToList (inputFileName: string) =
    [                                             
        use fileReader = new StreamReader(inputFileName)  
        while not fileReader.EndOfStream do          
            let line = splitReplaceToArr (fileReader.ReadLine())
            yield line                               
     ]
 
let headerArr = List.hd (linesReadRepToList inputFileName)
let personList = List.map (fun arr -> new Person (arr))  (List.tl (linesReadRepToList inputFileName))
let sortedList = List.sortWith(fun (l:Person) (r:Person) -> r.age - l.age) personList 
let resultList = (Array.reduce  (fun s inStr -> s + "\t" + inStr) headerArr) :: 
                    (List.map (fun (p:Person) -> p.toFormat()) sortedList) 
 
File.WriteAllLines(outputFileName,resultList)

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。