CONVERSÃO DE CAMPO CSV MYSQL ** RESOLVIDO **

Amigos,

Em um arquivo CSV tenho valores como ‘52,77’, ‘48,8’, ‘1.298,4’, ‘2.725,76’, como faço para transformar esses valores e gravar em capo campo decimal do MySql.

Obrigado

George,

Não entendi muito bem, mas se foi o que eu entendi:
Utilize editor de texto e substitua primeiro o “.” por nada e depois as virgulas por ponto e manda inserir.
Pode utilizar o php também, utilizando o str_replace.

Abs.

Marcelo,

Não posso editar manualmente, são centenas de valores e a importação é em uma rotina.

Obrigado

Na rotina de importação não tem como editar o valor antes de inserir ?

Bom dia Cleyton,

Tenho que fazer a conversão dos valores através de comandos na rotina, mais não consegui.

A rotina está em PHP ?

Sim, em PHP.

Posta ai pra gente analisar

// APAGA IMPORTACOES
sc_exec_sql(“delete
from fin_consignacoes_importa”);

// NOME DOS ARQUIVOS
$file1 = {ativos_inativos};

// DEFINE CARACTER SEPARADOR
$caracter = ‘;’;
$replace = ‘"’;

// CAMINHO DO ATIVOS E INATIVOS
$arq1 = $dir.’/ativos_inativos.csv’;

// ABRE O ARQUIVO ATIVOS E INATIVOS
$fp = fopen($arq1,‘r’);

// LER O CABECALHO ATIVOS E INATIVOS E NAO FAZ NADA
$linha = fgets($fp);

// PROCESSA ATIVOS E INATIVOS
while(($linha = fgets($fp) )!==false){
$campos = explode($caracter,$linha);
$vmatricula = $campos[0];
$vcpf = $campos[1];
$vnome = $campos[2];
$vvalor = $campos[4];
$vsituacao = $campos[6];
$vmatricula = str_replace($replace, “”, $vmatricula);
$vcpf = str_replace($replace, “”, $vcpf);
$vcpf = str_replace(".", “”, $vcpf);
$vcpf = str_replace("-", “”, $vcpf);
$vnome = str_replace($replace, “”, $vnome);

   $vsituacao  = substr($vsituacao, 0,4);
  if($vsituacao == '1501' or $vsituacao == '3901'){
    $vsituacao = '2';
 }elseif($vsituacao == '8401'){
           $vsituacao = '1';
       }else{
     $vsituacao = '0'; 
 }

sc_exec_sql(“insert into fin_consignacoes_importa
values(’$vmatricula’,’$vcpf’,’$vnome’,’$vvalor’,’$vsituacao’,Null)”);
}

fclose($fp);

No INSERT o comando apresenta erro na coluna $vvalor.

Quase resolvi com a linha:

$vvalor = str_replace(",", “.”, $vvalor);

Funciona para valores <= 999,99, para valores >= 1.000,00 cancela

Depois dessa linha $vnome = str_replace($replace, “”, $vnome);

insere essas duas linhas.

$vvalor = str_replace(".", “”);
$vvalor = str_replace(",", “.”);

Como o separador de decimal está usando virgula, pode estar mudando a sintaxe mysql e dando erro.

Faz um testa mandando sem ponto e sem virgula para ver se o banco resolve.

Primeiro tira o ponto e depois troca a virgula por ponto.

Marcelo, sua sugestão não funciona.

Cleyton, a sugestão de Marcelo retirar os pontos e virgulas, não funciona.

Coma a linha que acrescentei funciona até achar um valor > 999,99

Erro ao acessar o banco de dados
Incorrect decimal value: ‘2.540.03’ for column ‘valor’ at row 1

Como retiro o primeiro ponto?

Acho que depende um pouco de como o banco está configurado. Eu tenho um campo decimal 10,2 e mando o valor sem ponto e sem virgula e o valor após o insert fica correto. Banco configurado para usar ponto como separador de decimal.

primeiro essa $vvalor = str_replace(".", “”, $vvalor);
depois essa $vvalor = str_replace(",", “.”, $vvalor);

Cleyton,

Se o valor no csv (texto) for, 8,9 no MySql fica ,89.

A dica do Marcelo tem que funcionar. O tamanho do campo está correto ?

Eu á tinha feito como a dica do Marcelo:

Se o valor no csv (texto) for, 8,9 no MySql fica ,89.

Vc precisa substituir a virgula por ponto.

$vvalor = str_replace(".", “”, $vvalor); // Aqui vc troca o primeiro ponto por nada
$vvalor = str_replace(",", “.”, $vvalor); // Aqui vc troca a última virgula por ponto