RosettaCodeData/Task/FASTA-format/OCaml/fasta-format.ml

41 lines
1.1 KiB
OCaml

(* This program reads from the standard input and writes to standard output.
* Examples of use:
* $ ocaml fasta.ml < fasta_file.txt
* $ ocaml fasta.ml < fasta_file.txt > my_result.txt
*
* The FASTA file is assumed to have a specific format, where the first line
* contains a label in the form of '>blablabla', i.e. with a '>' as the first
* character.
*)
let labelstart = '>'
let is_label s = s.[0] = labelstart
let get_label s = String.sub s 1 (String.length s - 1)
let read_in channel = input_line channel |> String.trim
let print_fasta chan =
let rec doloop currlabel line =
if is_label line then begin
if currlabel <> "" then print_newline ();
let newlabel = get_label line in
print_string (newlabel ^ ": ");
doloop newlabel (read_in chan)
end
else begin
print_string line;
doloop currlabel (read_in chan)
end
in
try
match read_in chan with
| line when is_label line -> doloop "" line
| _ -> failwith "Badly formatted FASTA file?"
with
End_of_file -> print_newline ()
let () =
print_fasta stdin