package io import ( "bufio" "fmt" "os" "strings" ) func FileToStringArray(filename string) ([]string, error) { file, err := os.Open(filename) if err != nil { return nil, err } defer file.Close() scanner := bufio.NewScanner(file) scanner.Split(bufio.ScanLines) var fileLines []string for scanner.Scan() { fileLines = append(fileLines, scanner.Text()) } if err := scanner.Err(); err != nil { return nil, err } file.Close() return fileLines, nil } func WriteStringsToFile(content []string, filepath string) error { file, err := os.Create(filepath) if err != nil { return err } w := bufio.NewWriter(file) for _, line := range content { _, err = fmt.Fprintln(w, line) if err != nil { return err } } if err = w.Flush(); err != nil { return err } if err = file.Close(); err != nil { return err } return nil } // ParseFasta parses a .fasta formatted file returning a list of labels and a list of // content in separate string arrays. func ParseFasta(filename string) ([]string, []string, error) { lines, err := FileToStringArray(filename) if err != nil { return nil, nil, err } var labels []string var content []string var currString []string for _, line := range lines { if line[0] == '>' { labels = append(labels, line) if len(currString) > 0 { content = append(content, strings.Join(currString, "")) currString = []string{} } continue } currString = append(currString, line) } if len(currString) > 0 { content = append(content, strings.Join(currString, "")) } return labels, content, nil }