我有一个分隔的数据字符串,例如
a~b~c~d~e~f~g~h~i~j~k~l~...
dog~cat~fish~parrot~mother~father~child~grandparent~...
hello~hi~greetings~yo
Run Code Online (Sandbox Code Playgroud)
我想将数据加载到数组/ seq类型的记录中
type myType {
first: string;
second: string;
third: string;
fourth:string;
}
Run Code Online (Sandbox Code Playgroud)
所以我最终得到了数组/ seq中的3个对象.我一直在乱用for循环来做这件事,但感觉非常迫切.如何使用功能成语来实现这一目标?
编辑:我应该澄清的是,分隔的数据可能是可变长度的,尽管分隔的项目数应始终是4所以倍数,每次迭代中,我期待窄条4个输入数据的其加载到输入类型,一旦消耗完所有数据,返回一个Array/seq.
编辑2:所以我最终得到了这样的东西
let createValues(data: string) =
let splitValues(valueString) =
let rec splitData acc = function
| a :: b :: c :: d :: xs -> splitData ({ first=a; second=b; third=c; fourth=d } :: acc) xs
| [] -> acc
| _ -> failwith "uneven data"
splitData [] valueString
splitValues (data.Split [|'~'|] |> Array.toList)
Run Code Online (Sandbox Code Playgroud)
谢谢
您的类型只包含单个字符 - 假设数据始终由单个字符组成,则不需要分隔符.下面是将数据映射到类型列表的一种方法,这只有在数据中的字符数可以被4整除时才有效,但是可以使用可变大小的输入.
let data = "a~b~c~d~e~f~g~h~i~j~k~l~m~n~o~p"
let splitData data =
let rec aux acc = function
| a::b::c::d::xs -> aux ({ first=a; second=b; third=c; fourth=d } :: acc) xs
| [] -> acc
| _ -> failwith "uneven data"
aux [] data
let output = splitData (data.Replace("~","").ToCharArray() |> Array.toList)
Run Code Online (Sandbox Code Playgroud)