нужна помощь для чтения файла с определенным форматированным содержимым - PullRequest
2 голосов
/ 28 сентября 2011

Я использую 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 и я хочу сохранить номера этой карты в двухмерном массиве. Кто-то может помочь мне написать код, чтобы сохранить все числа из файла, чтобы я мог обработать его? * Извините, мой английский плохой, надеюсь, мой вопрос понятен:

Ответ на мой вопрос: Спасибо за ответ от Даниила и Анкура. Я использую код от вас обоих:

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 ]

1 голос
/ 28 сентября 2011

Вот быстрый и грязный код.Он возвращает кортеж из последнего числа в заголовке (в нашем случае 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"
0 голосов
/ 28 сентября 2011

В случае, если файл является таким большим (без дальнейшей обработки данных) и всегда в правильном формате (не нужно обрабатывать пропущенные данные и т. Д.), Тогда будет просто:

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
    |]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...