假设我有这个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.exe
在fsi 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
看起来不错,但仍然没有在命令窗口打印,原始文件没有任何反应。将更改写入文件的帮助很小(无论是新文件还是旧文件都无关紧要)。
答案 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
您可以通过两种方式运行:
作为剧本
fsi.exe script.fsx -- input.txt
或者编译它并运行可执行文件
fsc.exe script.fsx
script.exe input.txt