diff --git a/pkg/obiformats/fastseq_json_header.go b/pkg/obiformats/fastseq_json_header.go index 8006c53..af8de1c 100644 --- a/pkg/obiformats/fastseq_json_header.go +++ b/pkg/obiformats/fastseq_json_header.go @@ -296,7 +296,7 @@ func _parse_json_header_(header string, sequence *obiseq.BioSequence) string { case strings.HasSuffix(skey, "_taxid"): if dataType == jsonparser.Number || dataType == jsonparser.String { - rank, _ := obiutils.SplitInTwo(skey, '_') + rank := skey[:len(skey)-len("_taxid")] taxid := string(value) sequence.SetTaxid(taxid, rank) diff --git a/pkg/obiseq/biosequenceslice.go b/pkg/obiseq/biosequenceslice.go index 597a6dd..da16bf4 100644 --- a/pkg/obiseq/biosequenceslice.go +++ b/pkg/obiseq/biosequenceslice.go @@ -195,7 +195,7 @@ func (s *BioSequenceSlice) ExtractTaxonomy(taxonomy *obitax.Taxonomy, seqAsTaxa return nil, fmt.Errorf("sequence %v has no path", s.Id()) } last := path[len(path)-1] - taxname, _ := obiutils.SplitInTwo(last, ':') + taxname, _ := obiutils.LeftSplitInTwo(last, ':') if idx, ok := s.GetIntAttribute("seq_number"); !ok { return nil, errors.New("sequences are not numbered") } else { diff --git a/pkg/obitax/taxid.go b/pkg/obitax/taxid.go index f22ec4d..313a20d 100644 --- a/pkg/obitax/taxid.go +++ b/pkg/obitax/taxid.go @@ -31,7 +31,7 @@ func NewTaxidFactory(code string, alphabet obiutils.AsciiSet) *TaxidFactory { // It extracts the relevant part of the string after the first colon (':') if present. func (f *TaxidFactory) FromString(taxid string) (Taxid, error) { taxid = obiutils.AsciiSpaceSet.TrimLeft(taxid) - part1, part2 := obiutils.SplitInTwo(taxid, ':') + part1, part2 := obiutils.LeftSplitInTwo(taxid, ':') if len(part2) == 0 { taxid = part1 } else { diff --git a/pkg/obiutils/strings.go b/pkg/obiutils/strings.go index 2586206..c07b919 100644 --- a/pkg/obiutils/strings.go +++ b/pkg/obiutils/strings.go @@ -144,7 +144,7 @@ func (r *AsciiSet) TrimLeft(s string) string { return s[i:] } -func SplitInTwo(s string, sep byte) (string, string) { +func LeftSplitInTwo(s string, sep byte) (string, string) { i := 0 for ; i < len(s); i++ { c := s[i] @@ -157,3 +157,17 @@ func SplitInTwo(s string, sep byte) (string, string) { } return s[:i], s[i+1:] } + +func RightSplitInTwo(s string, sep byte) (string, string) { + i := len(s) - 1 + for ; i >= 0; i-- { + c := s[i] + if c == sep { + break + } + } + if i == len(s) { + return s, "" + } + return s[:i], s[i+1:] +}