Go
- 9 ответов
- 0 вопросов
6
Вклад в тег
done := make(chan book, 1)
нужно из файла взять подстроку после : и проверить существует ли подстрока из 1 файла в подстроке файла 2(до :) и если она есть, то записать строку в виде: подстрока из 1 файла: подстрока из 2 файла
размеры файлов до 1гб
file1, err := os.Open(config.First_file)
if err != nil {
log.Fatalln("error")
}
defer file1.Close()
file1Scanner := bufio.NewScanner(file1)
file2, err := os.Open(config.Second_file)
if err != nil {
log.Fatalln("error")
}
defer file2.Close()
file2Scanner := bufio.NewScanner(file2)
// находим все доступные подстроки из файла 2
file2SubSrings := make([]string,0)
for file2Scanner.Scan(){
file2SubSrings = append(file2SubSrings, strings.Split(file2Scanner.Text(), ":")[0])
}
for file1Scanner.Scan() {
file1SubString := strings.Split(file1Scanner.Text(), ":")[1]
for _, val := range file2SubStrings{
if strings.Contains(val, file1SubString) {
log.Println(file1SubString, ":", val)
break
}
}
if err := file1Scanner.Err(); err != nil {
log.Fatalln(err)
}
if err := file2Scanner.Err(); err != nil {
log.Fatalln(err)
}
func scanFiles(file1, file2 *bufio.Scanner) {
// находим все доступные подстроки из файла 2
file2SubStrings := make([]string, 0)
for file2.Scan() {
file2SubStrings = append(file2SubStrings, strings.Split(file2.Text(), ":")[0])
}
wg := new(sync.WaitGroup)
valChan := make(chan string)
for i := 0; i < 5; i++ {
wg.Add(1)
go findIntersections(valChan, file2SubStrings, wg)
}
for file1.Scan() {
valChan <- strings.Split(file1.Text(), ":")[1]
}
wg.Wait()
}
func findIntersections(values chan string, file2SubStrings []string, wg *sync.WaitGroup) {
for {
file1SubString, ok := <-values
if !ok {
wg.Done()
return
}
for _, val := range file2SubStrings {
if strings.Contains(val, file1SubString) {
log.Println(file1SubString, ":", val)
break
}
}
}
}
строка из файла 2 - 663624e4aae0164132f10f09fdd9fcd2:liberty_
строка из файла 1 - scherbakovatd@example.com:663624e4aae0164132f10f09fdd9fcd2
на выходе должно выйти scherbakovatd@example.com:liberty_
func scanFiles(file1, file2 *bufio.Scanner) {
scanWg := new(sync.WaitGroup)
scanWg.Add(2)
file1SubStrings := make(map[string]string)
file2SubStrings := make(map[string]string)
go func() {
var substr []string
for file1.Scan() {
substr = strings.Split(file1.Text(), ":")
file1SubStrings[substr[1]] = substr[0]
}
scanWg.Done()
}()
go func() {
var substr []string
for file2.Scan() {
substr = strings.Split(file2.Text(), ":")
file2SubStrings[substr[0]] = substr[1]
}
scanWg.Done()
}()
scanWg.Wait()
wg := new(sync.WaitGroup)
valChan := make(chan struct{k,v string})
for i := 0; i < 5; i++ {
wg.Add(1)
go findIntersections(valChan, file2SubStrings, wg)
}
for k, v := range file1SubStrings {
valChan <- struct{ k, v string }{k: k, v: v}
}
wg.Wait()
}
func findIntersections(file1Values chan struct{ k,v string}, file2 map[string]string, wg *sync.WaitGroup) {
for {
file1, ok := <-file1Values
if !ok {
wg.Done()
return
}
if file2Value, ok := file2[file1.k];ok {
log.Println(file1.k, ":", file2Value)
}
}
}
'{$1}'постгрес воспринимает это как просто строку, а не как параметр для вставки.
Пробовал явно указывать тип $1
query := `
UPDATE type
SET characteristics = jsonb_insert(
characteristics, '{$1}'::text, '{"type": "$2", "measure": "$3"}'::jsonb
)
WHERE id=$4`
Так тоже ошибка : function jsonb_insert(jsonb, text, jsonb) does not exist
jsonb_insert(target jsonb, path text[], new_value jsonb [, insert_after boolean])Поэтому строка `'{$1}'::text'`, должна быть `'{$1}'::text[]'`. (Но и это не совсем поможет)
query := `
UPDATE type
SET characteristics = jsonb_insert(
characteristics, array[$1::text],
jsonb_build_object('type', $2, 'measure', '$3')
)
WHERE id=$4`
tag, err := conn.Exec(ctx, query,
c.Name, // string
c.Type, // string
c.Measure, // string
c.ID, // uint64
)
query := `
UPDATE type
SET characteristics = jsonb_insert(
characteristics, array[$1::text], $2
)
WHERE id=$3`
tag, err := conn.Exec(ctx, query,
c.Name, // string
struct{ // лучше вынести как отдельный тип
Type string `json:"type"`
Measure string `json:"measure"`
}{c.Type, c.Measure}
c.ID, // uint64
)