2013-06-30 4 views
10

私はF#で作業し始めています。典型的なidomsと効果的な考え方と作業方法を理解しようとしています。F#でのファイル変換

タスクは、カンマ区切りのタブ区切りファイルへの単純な変換です。 )私は、単一Regex.Replace(とオペレーションの分割/連結のペアを交換し

// inFile and outFile defined in preceding code not shown here 

for line in File.ReadLines(inFile) do 
    let typicalArray = line.Split '\t' 
    let transformedLine = typicalArray |> String.concat "," 
    outFile.WriteLine(transformedLine) 

:私はこのようなコードをループで始まっ

let line = "@ES# 01/31/2006 13:31:00 1303.00 1303.00 1302.00 1302.00 2514 0" 

:典型的な入力行は次のようになります。

for line in File.ReadLines(inFile) do 
    let transformedLine = Regex.Replace(line, "\t",",") 
    outFile.WriteLine(transformedLine) 

そして今、最終的には、パイプラインでループ交換した:

File.ReadLines(inFile) 
    |> Seq.map (fun x -> Regex.Replace(x, "\t", ",")) 
    |> Seq.iter (fun y -> outFile.WriteLine(y)) 

    // other housekeeping code below here not shown 

すべてのバージョンが動作しますが、最終バージョンは私にとっては最も直感的です。これは、経験豊富なF#プログラマーがこのタスクをどのように達成するのでしょうか?

+0

私はあなたと同じ方法でやるでしょう –

+1

3番目のバージョンの最後の行に匿名関数を残して、これを実行します: '|> Seq.iter outFile.WriteLine' –

+1

これは非常に素晴らしいことです。 **振り返ってみると、明らかに単純化されている。ありがとう! – akucheck

答えて

11

私はすべての3つのバージョンが、F#のエキスパートが書いてくれる完璧な、慣用的なコードだと思います。

私は一般的な言語機能(forループ、ifなど)を使用してコードを書くことをお勧めします。これらは不可欠ですが、APIで命令コード(たとえばoutFile.WriteLineなど)が必要な場合は、これらを使用することをお勧めします。あなたが言及したように - あなたはこのバージョンで始まりました(そして私も同じことをやっています)。高階関数を使用して

もいいです - 私はおそらく私がデータに変換を書いて、ラインの新しいシーケンスまたはリストを取得したい場合にのみ、ということだろうが - あなたはFile.WriteAllLinesの代わりを使用していた場合、これは便利だろう行を1行ずつ書く。また、単にシーケンス式と2番目のバージョンをラップすることにより行うことができること、が:

let transformed = 
    seq { for line in File.ReadLines(inFile) -> Regex.Replace(line, "\t",",") } 
File.WriteAllLines(outFilePath, transformed) 

私は、バージョンのいずれかを好むために何らかの客観的な理由があるとは思いません。私の個人的な趣味の好みは、forとリファクタリングを使用して(必要に応じて)式をシーケンスすることですが、他のものはそう思わないでしょう。

+0

ありがとう、トマス - 非常に感謝します。 – akucheck

関連する問題