1

假设我有这个 txt 文件:

a
b
c
d
e
f
g
h
ch

对于我要添加的每一行,3,然后我想根据行数添加字符。将第一行添加,k到第二行添加,r并添加到第三行,,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.exefsi 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]获取函数的第一个参数。

对于你的第二个问题,你想做类似的事情

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

编辑(更新问题)

如果您没有看到任何打印内容,我猜您的文件路径错误 - 可能添加类似

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]asfsi.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

您可以通过两种方式运行它:

  1. 作为脚本

    fsi.exe script.fsx -- input.txt

  2. 或者编译它并运行可执行文件

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

于 2013-06-20T09:23:33.793 回答