package main import ( "bufio" "errors" "fmt" "io/ioutil" "os" "strings" "time" ) const ( inputFileName = "input_tiny.vcf" ) var ( errNoMatch = errors.New("no match") // Used by readSequenceIndexed chromosomePositionIndex map[string]string ) func readSequenceLineByLine(inputChromosome, inputPosition string) (reference *string, err error) { file, err := os.Open(inputFileName) if err != nil { return nil, err } defer file.Close() scanner := bufio.NewScanner(file) for scanner.Scan() { ln := scanner.Text() if strings.HasPrefix(ln, "#") { continue } rows := strings.Split(ln, "\t") if len(rows) < 3 { continue } var ( chromosome = rows[0] position = rows[1] ref = rows[3] ) if inputChromosome == chromosome && inputPosition == position { reference = &ref return } } return nil, errNoMatch } func readSequenceFullRead(inputChromosome, inputPosition string) (reference *string, err error) { rawData, err := ioutil.ReadFile(inputFileName) if err != nil { return nil, err } lines := strings.Split(string(rawData), "\n") for _, ln := range lines { if strings.HasPrefix(ln, "#") { continue } rows := strings.Split(ln, "\t") if len(rows) < 3 { continue } var ( chromosome = rows[0] position = rows[1] ref = rows[3] ) if inputChromosome == chromosome && inputPosition == position { reference = &ref return } } return nil, errNoMatch } func readSequenceIndexed(inputChromosome, inputPosition string) (reference *string, err error) { if chromosomePositionIndex == nil { chromosomePositionIndex = make(map[string]string, 0) var rawData []byte rawData, err = ioutil.ReadFile(inputFileName) if err != nil { return nil, err } lines := strings.Split(string(rawData), "\n") for _, ln := range lines { if strings.HasPrefix(ln, "#") { continue } rows := strings.Split(ln, "\t") if len(rows) < 3 { continue } var ( chromosome = rows[0] position = rows[1] ref = rows[3] ) key := chromosome + position chromosomePositionIndex[key] = ref } } inputKey := inputChromosome + inputPosition val, found := chromosomePositionIndex[inputKey] if found { return &val, nil } return nil, errNoMatch } func main() { ref, err := readSequenceFullRead("chr1", "16837") if err != nil { panic(err) } fmt.Println("ref=", *ref) ref2, err := readSequenceLineByLine("chr1", "16837") if err != nil { panic(err) } fmt.Println("ref2=", *ref2) }