在F#中添加基于其他行值的行值

时间:2013-10-03 11:58:09

标签: f# add

这是针对F#。

我有一个包含4行的.data文件: 城镇,人口,自治市,以及农村或城市类型的城镇。 我已经使用Int32.Parse解析了“population”列。

我的问题是,如何根据市政名称添加每一行的人口?也就是说,有几个城镇属于同一个城市,并希望添加这些人口在同一个城市。

这是我到目前为止的代码,感谢任何帮助:

open System

let rec convertDataRow(csvLine:string) = 
  let cells = List.ofSeq(csvLine.Split(','))
  match cells with
  | name :: popul :: county :: townorcommune :: _ ->
    let parsedNumber = Int32.Parse(popul)
    (name, parsedNumber, county, townorcommune)
  | _ -> failwith "Incorrect data format!"

let rec processLines (lines) = 
  match lines with
  | [] -> []
  | currentLine :: remaining ->
    let parsedLine = convertDataRow(currentLine)
    let parsedRest = processLines(remaining)
    parsedLine :: parsedRest

open System.IO
let lines = List.ofSeq(File.ReadAllLines(@"C:\Users\townspopulation.data"))

processLines(lines)

1 个答案:

答案 0 :(得分:1)

提供一些指导。

使用Seq.groupBy按名称对数据进行排序,然后您可以添加内容。像

这样的东西
Seq.groupBy (fun (a,_,_,_) -> a) 
|> Seq.map (Seq.fold (fun (sum,_) (n,a,_,_) -> (sum+a),n) (0,""))

在这里,我们使用groupBy来获取按照我们想要的方式排序的数据,然后再使用地图并折叠以对总体进行求和