Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "bufio"
- "fmt"
- "os"
- "strconv"
- )
- var (
- db = []string{"1", "3", "5", "7", "99"}
- length = len(db)
- actions = make(map[int]bool)
- )
- func main() {
- f, _ := os.Open("result") // читаем файл со свежей выборкой данных
- defer f.Close() // закрываем файл на выходе из функции
- scanner := bufio.NewScanner(f) // открываем сканнер файла
- var iCurrDBElem, iCurrFileElem, iDBElemPos int // инициализируем переменные: iCurrDBElem - элемент из текущей базы данных, iCurrFileElem - элемент из файла, iDBElemPos - позиция текущего элемента в БД
- var isA, isR = true, true // индикатор проверки элемента: если true, значит данный элемент уже сравнивали, можно брать следующий
- var endOfA, endOfR bool // индикатор конца массива с данными из БД/файла
- for {
- if iDBElemPos == length { // если iDBElemPos равно длине массива
- endOfA = true // то больше не пытаемся считать новый элемент из массива, чтобы не выйти за диапазон
- }
- if isA { // если выполняется условие проверки предыдущего элемента, то берем из массива новый
- for ; iDBElemPos < length; iDBElemPos++ {
- if iNextDBElem, err := strconv.Atoi(db[iDBElemPos]); err != nil || iNextDBElem == iCurrDBElem { // конвертируем строковое значение из массива в числовое
- continue // если ошибка конвертации, или новое значение (iNextDBElem) совпадает с текущим (А), то берем следующее
- } else { // в противном случае переназначаем текущее значение элемента из БД, увеличиваем счетчик
- iCurrDBElem, iDBElemPos, isA = iNextDBElem, iDBElemPos+1, false // индиактор равен false, пока мы не решим, что делать с текущим элементом
- break // выходим из цикла
- }
- }
- }
- if isR { // аналогичные действия с элементами из файла
- endOfFile := true // Scan() возвращает булево значение, можно ли считать данные из файла, поэтому сначала предполагаем, что файл закончился
- for scanner.Scan() { // если можем считать новые данные
- if iNextFileElem, err := strconv.Atoi(scanner.Text()); err != nil || iNextFileElem == iCurrFileElem { // при этом нет ошибок и новый элемент не равен предыдущему
- continue
- } else { // то перезаписываем текущий элемент, обнуляем индикаторы конца файла и условия проверки текущего
- iCurrFileElem, endOfFile, isR = iNextFileElem, false, false
- break
- }
- }
- if endOfFile { // если мы не переназначили данную переменную, то значит файл действительно кончился
- endOfR = true // (работать со сканером пиздец как неудобно)
- }
- }
- if endOfA || endOfR { // для начала проверяем, не закончился ли массив или файл, это нужно, чтобы не реинициализировать индикаторы проверки текущих элементов, и не полезть за новыми данными
- if iCurrDBElem < iCurrFileElem { // если элемент из БД меньше элемента из файла
- if !isA { // и мы еще не сравнивали этот элемент
- actions[iCurrDBElem] = false // то помечаем элемент из БД на удаление
- }
- if !isR { // если же элемент из файла еще ни разу не был проверен
- actions[iCurrFileElem], isR = true, true // то помечаем его на добавление, ставим индикатор, что можно взять из файла новый элемент
- }
- } else if iCurrDBElem > iCurrFileElem {
- if !isR {
- actions[iCurrFileElem] = true
- }
- if !isA {
- actions[iCurrDBElem], isA = false, true
- }
- } else {
- if endOfA && !isA || endOfR && !isR {
- isA, isR = true, true
- }
- }
- }
- if !endOfA && !endOfR {
- if iCurrDBElem < iCurrFileElem {
- actions[iCurrDBElem], isR, isA = false, false, true
- } else if iCurrDBElem > iCurrFileElem {
- actions[iCurrFileElem], isA, isR = true, false, true
- } else {
- isA, isR = true, true
- }
- }
- if endOfA && endOfR {
- break
- }
- }
- fmt.Println(actions)
- }
Advertisement
Add Comment
Please, Sign In to add comment