F#脚本逐行读取文件并在每行中添加字符串

时间:2013-06-20 08:58:32

标签: text f#

假设我有这个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#的菜鸟,但我想开始学习它。刚才我需要这个脚本。所以,如果有人能发布我正确的解决方案,谢谢。

修改 感谢John Palmer,我现在有了这个:

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

看起来不错,但仍然没有在命令窗口打印,原始文件没有任何反应。将更改写入文件的帮助很小(无论是新文件还是旧文件都无关紧要)。

2 个答案:

答案 0 :(得分: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将输出到文件。

但是,我会先检查你是否正在打开正确的文件

答案 1 :(得分: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包含参数中脚本的名称。

或者,您可以使用类似link的内容将脚本设置为脚本和源文件。以下是适用于您的脚本的简化版本

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