我正在使用F#。我想解决一些需要我从文件中读取输入的问题,我不知道该怎么做。文件中的第一行由三个数字组成,前两个数字是下一行地图的x和y。示例文件:
5 5 10
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
5 5 10的意思是下一行有5x5地图,10只是我需要解决问题的一些数字,下一行直到行的结尾是我必须使用的地图解决的内容10,我想将这个地图编号保存在二维数组中。有人可以帮我写一个代码来保存文件中的所有数字,以便我可以处理它吗? *对不起,我的英语很糟糕,希望我的问题可以理解:)
我自己的问题的答案: 感谢Daniel和Ankur的回答。为了我自己的目的,我混合了你们两个人的代码:
let readMap2 (path:string) =
let lines = File.ReadAllLines path
let [|x; y; n|] = lines.[0].Split() |> Array.map int
let data =
[|
for l in (lines |> Array.toSeq |> Seq.skip 1) do
yield l.Split() |> Array.map int
|]
x,y,n,data
非常感谢:D
答案 0 :(得分:1)
这是一些快速而肮脏的代码。它返回标题中最后一个数字的元组(在本例中为10)和值的二维数组。
open System.IO
let readMap (path:string) =
use reader = new StreamReader(path)
match reader.ReadLine() with
| null -> failwith "empty file"
| line ->
match line.Split() with
| [|_; _; _|] as hdr ->
let [|x; y; n|] = hdr |> Array.map int
let vals = Array2D.zeroCreate y x
for i in 0..(y-1) do
match reader.ReadLine() with
| null -> failwith "unexpected end of file"
| line ->
let arr = line.Split() |> Array.map int
if arr.Length <> x then failwith "wrong number of fields"
else for j in 0..(x-1) do vals.[i, j] <- arr.[j]
n, vals
| _ -> failwith "bad header"
答案 1 :(得分:0)
如果文件只有这么多(没有其他数据要处理)并且格式正确(不需要处理丢失的数据等),那么它就像下面这样简单:
let readMap (path:string) =
let lines = File.ReadAllLines path
let [|_; _; n|] = lines.[0].Split() |> Array.map int
[|
for l in (lines |> Array.toSeq |> Seq.skip 1) do
yield l.Split() |> Array.map int
|]