2012-06-06 9 views
5

Me acaban de comenzar a jugar con F #, por lo que esta cuestión será probablemente bastante básico ...Uso Array.map omitiendo el primer elemento de la matriz en Fa #

me gustaría leer una línea archivo de texto por línea , y luego ignorar la primera línea y procesar las otras líneas usando una función dada. Así que estaba pensando en usar algo en la línea de:

File.ReadAllLines(path) 
|> Array.(ignore first element) 
|> Array.map processLine 

lo que sería una forma elegante y eficiente para lograrlo?

Respuesta

9

No hay una función simple para omitir la primera línea de una matriz, porque la operación no es eficiente (tendría que copiar toda la matriz), pero puede hacerlo fácilmente si usa secuencias perezosas en su lugar:

File.ReadAllLines(path) 
|> Seq.skip 1 
|> Seq.map processLine 

Si necesita el resultado en una matriz (en contraposición a seq<'T>, que es un F # alias para IEnumerable<'T>), entonces se puede añadir Seq.toArray hasta el final. Sin embargo, si solo desea iterar sobre las líneas más adelante, entonces probablemente solo pueda usar secuencias.

2

Esto es una adición a la respuesta de Tomas, que generalmente estoy de acuerdo. Una cosa para ver es qué sucede si su matriz o secuencia no contiene líneas. (O menos líneas de las que desea omitir). En ese caso, Seq.skip emitirá una excepción. La forma más concisa en todo esto que se me ocurre es:

System.IO.File.ReadAllLines fileName 
|> Seq.mapi (fun i elem -> i, elem) 
|> Seq.choose (fun (i, elem) -> if i > 0 then Some(elem) else None) 
0

omite el primer elemento de una matriz F # simplemente myArray.[1..]. Me encanta lo elegante que es este lenguaje.

Cuestiones relacionadas