1

このtxtファイルがあるとしましょう:

a
b
c
d
e
f
g
h
ch

追加したい各行に,3、行数に文字一致を追加したい。1 行目に追加,kして 2 行,r目に追加し、3 行目に追加,pして、これを最後まで繰り返します。

したがって、結果は次のようになります。

a,k,3
b,r,3
c,p,3
d,k,3
e,r,3
f,p,3
g,k,3
h,p,3
ch,r,3

私は行を繰り返すためにこれを持っています:

open System.IO

[<EntryPoint>]
let main argv =
    File.ReadLines(argv.[0]) |> Seq.iter (printfn "%s")
    0

それでも機能しません(行を印刷していません)。私はこれを実行しcmd.exeていfsi script.fsx namefile.txtます。

私は F# の初心者ですが、学習を開始したいと考えています。ちょうど今、このスクリプトが必要です。だから誰かが私に正しい解決策を投稿できるなら、ありがとう。

編集: ジョン・パーマーのおかげで、私は今これを持っています:

open System.IO

[<EntryPoint>]
let main argv =
    File.ReadLines(argv.[1]) |> Seq.iteri (fun i x -> match i % 3 with
                                                                 | 0 -> printfn "%s,k,3" x
                                                                 | 1 -> printfn "%s,r,3" x
                                                                 | 2 -> printfn "%s,p,3" x
                                                                 | _ -> printfn "%s" x)
    0

良さそうに見えますが、コマンド ウィンドウで何も印刷されず、元のファイルには何も起こりません。そのため、変更をファイルに書き込むのにほとんど役に立ちません (新しいファイルか古いファイルかは関係ありません)。

4

2 に答える 2

2

の最初のエントリargvは、実行可能ファイルの名前です。その結果、関数の最初の引数を取得するargv.[1]よりも、使用したくなるでしょう。argv.[0]

2番目の問題については、次のようなことをしたい

Seq.iteri (fun i x -> match i % 3 with
                      | 0 -> printfn "%s,k,3" x
                      //other cases similar

EDIT(更新された質問用)

何も印刷されていない場合は、ファイルパスが間違っていると思います-おそらく次のようなものを追加してください

printfn "%s" (argv.[1])

正しいファイルを開いていることを確認します。

ファイルに出力したい場合は、次のようにする必要があります

use file = System.IO.File.CreateText("Some file name)
File.ReadLines(argv.[1]) 
|> Seq.mapi (fun i x -> match i%3 with |0 -> fprintfn ...) //note fprintfn instead of printfn

ファイルにfprintf出力されます。

ただし、最初に正しいファイルを開いていることを確認します

于 2013-06-20T09:04:46.903 に答える
1

を使用すると、エントリ ポイントが自動的に実行されません。fsiを使用してコンパイルした場合、コードは機能しますfsc。このように変更すると、 経由で実行できますfsi

open System.IO

let main (argv:string[]) =
    File.ReadLines(argv.[1]) |> Seq.iter (printfn "%s")
    0

main fsi.CommandLineArgs

John Palmer が示唆したように、引数にスクリプトの名前を含めるargv.[1]必要があることに注意してください。fsi.CommandLineArgs

または、このリンクのようなものを使用して、スクリプトをスクリプトおよびソース ファイルとして機能するようにセットアップすることもできます。これは、スクリプトに適用される単純化されたバージョンです

open System.IO

#if COMPILED
[<EntryPoint>]
#endif
let main (argv:string[]) =
    File.ReadLines(argv.[0]) |> Seq.iter (printfn "%s")
    0

#if INTERACTIVE
fsi.CommandLineArgs |> Seq.skip 1 |> Seq.toArray |> main
#endif

これは、次の 2 つの方法で実行できます。

  1. スクリプトとして

    fsi.exe script.fsx -- input.txt

  2. または、コンパイルして実行可能ファイルを実行します

    fsc.exe script.fsx
    script.exe input.txt

于 2013-06-20T09:23:33.793 に答える