rosalind-solutions/go/pkg/io/file_tools.go

87 lines
1.6 KiB
Go
Raw Normal View History

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
}