Ответы пользователя по тегу Go
  • Как правильно парсить yml файл с кодировкой Windows-1251?

    ubukulov
    @ubukulov Автор вопроса
    Веб-разработчик
    Задача решили другим способом. Ниже предлагаю метод. Конвертация мы сделали с помощью команду линукс.

    func DownloadPowerFile(url string) *PowerCatalog {
    	list := PowerCatalog{}
    	// скачиваем файл по ссылке и сохраняем в папку files
    	err := DownloadFilePower("Powerplant_Talapai.yml", url)
    	if err != nil {
    		fmt.Println(err)
    		return &list
    	}
    	var path string
    	path = "/root/go-workpath/src/stocks/files/"
    	// переконвертируем файл
    	cmd := exec.Command("iconv", "-f", "cp1251", "-t", "utf8",  path + "Powerplant_Talapai.yml", "-o", path + "Powerplant_Talapai8.yml")
    	out, err := cmd.CombinedOutput()
    	if err != nil {
    		fmt.Printf("cmd.Run() failed with %s\n", err)
    	}
    	fmt.Printf("combined out:\n%s\n", string(out))
    	// из файла Powerplant_Talapai8.yml убираем строку encoding="windows-1251". Надо проверит в наличие программу SED
    	cmd2 := exec.Command("sed", "-i", "s/ encoding=\"windows-1251\"//", path + "Powerplant_Talapai8.yml")
    
    	out2, err2 := cmd2.CombinedOutput()
    	if err2 != nil {
    		fmt.Printf("cmd.Run() failed with %s\n", err2)
    	}
    	fmt.Printf("combined out:\n%s\n", string(out2))
    	// открытие файла
    	resp, err := os.Open(path + "Powerplant_Talapai8.yml")
    
    	if(err != nil) {
    		fmt.Println("Невозможно найти файл или открыть")
    		return &list
    	} else {
    
    		defer resp.Close()
    
    		body, err := ioutil.ReadAll(resp)
    
    		if err != nil {
    			return &list
    		}
    
    		newbody := strings.Replace(string(body), "<offers>", "", -1)
    		newbody = strings.Replace(newbody, "</offers>", "", -1)
    		err = xml.Unmarshal([]byte(newbody), &list)
    
    		if err != nil {
    			fmt.Println(err)
    			return &list
    		}
    
    		return &list
    	}
    }
    
    func DownloadFilePower(filepath string, url string) error {
    
    	// Create the file
    	out, err := os.Create("files/"+filepath)
    	if err != nil {
    		return err
    	}
    	defer out.Close()
    
    	// Get the data
    	resp, err := http.Get(url)
    	if err != nil {
    		return err
    	}
    	defer resp.Body.Close()
    
    	// Write the body to file
    	_, err = io.Copy(out, resp.Body)
    	if err != nil {
    		return err
    	}
    
    	return nil
    }
    Ответ написан
    Комментировать
  • Как решить проблему "xml: encoding "windows-1251" declared but Decoder.CharsetReader is nil"?

    ubukulov
    @ubukulov Автор вопроса
    Веб-разработчик
    Задача решили другим способом. Ниже предлагаю метод. Конвертация мы сделали с помощью команду линукс.

    func DownloadPowerFile(url string) *PowerCatalog {
    	list := PowerCatalog{}
    	// скачиваем файл по ссылке и сохраняем в папку files
    	err := DownloadFilePower("Powerplant_Talapai.yml", url)
    	if err != nil {
    		fmt.Println(err)
    		return &list
    	}
    	var path string
    	path = "/root/go-workpath/src/stocks/files/"
    	// переконвертируем файл
    	cmd := exec.Command("iconv", "-f", "cp1251", "-t", "utf8",  path + "Powerplant_Talapai.yml", "-o", path + "Powerplant_Talapai8.yml")
    	out, err := cmd.CombinedOutput()
    	if err != nil {
    		fmt.Printf("cmd.Run() failed with %s\n", err)
    	}
    	fmt.Printf("combined out:\n%s\n", string(out))
    	// из файла Powerplant_Talapai8.yml убираем строку encoding="windows-1251". Надо проверит в наличие программу SED
    	cmd2 := exec.Command("sed", "-i", "s/ encoding=\"windows-1251\"//", path + "Powerplant_Talapai8.yml")
    
    	out2, err2 := cmd2.CombinedOutput()
    	if err2 != nil {
    		fmt.Printf("cmd.Run() failed with %s\n", err2)
    	}
    	fmt.Printf("combined out:\n%s\n", string(out2))
    	// открытие файла
    	resp, err := os.Open(path + "Powerplant_Talapai8.yml")
    
    	if(err != nil) {
    		fmt.Println("Невозможно найти файл или открыть")
    		return &list
    	} else {
    
    		defer resp.Close()
    
    		body, err := ioutil.ReadAll(resp)
    
    		if err != nil {
    			return &list
    		}
    
    		newbody := strings.Replace(string(body), "<offers>", "", -1)
    		newbody = strings.Replace(newbody, "</offers>", "", -1)
    		err = xml.Unmarshal([]byte(newbody), &list)
    
    		if err != nil {
    			fmt.Println(err)
    			return &list
    		}
    
    		return &list
    	}
    }
    
    func DownloadFilePower(filepath string, url string) error {
    
    	// Create the file
    	out, err := os.Create("files/"+filepath)
    	if err != nil {
    		return err
    	}
    	defer out.Close()
    
    	// Get the data
    	resp, err := http.Get(url)
    	if err != nil {
    		return err
    	}
    	defer resp.Body.Close()
    
    	// Write the body to file
    	_, err = io.Copy(out, resp.Body)
    	if err != nil {
    		return err
    	}
    
    	return nil
    }
    Ответ написан
    Комментировать