需要帮助来读取具有特定格式内容的文件

时间:2011-09-28 13:00:02

标签: f#

我正在使用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

2 个答案:

答案 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
    |]