Vai Somente um registro ao Importar TXT

Olá pessoal, muitos anos atrás, tive que fazer um contra-cheque para os funcionários para consultar e eu pegava o TXT e importava para o banco. Tinha umas 3 tabelas Cabeçalho, Funcionário e referencia. Funcionava perfeito. Agora estou querendo importar o TXT do bradesco para o sistema financeiro do SC.
Não vai precisar do cabeçalho, somente 1 tabela pois retirar só os registros mesmos.
Estou fazendo um teste com uma tabela teste, no entanto só esta indo o primeiro registro os outros registros não estão indo.

$_file=$this->Ini->path_doc."/".{arquivo};
$handle = @fopen($_file, “r”);
$_c1=0;
if ($handle) {
while (!feof($handle)) {
$buffer = trim(fgets($handle, 4096));
$_arr=explode(" ",$buffer);
if (!empty($buffer) && strpos($buffer,“Total de Fun”)===False)
{
$_c1++;
if ($_c1==1)
{

$insert_sql = ‘INSERT INTO teste (’
.'nome,sobrenome) VALUES ';

				$nome = $_arr[0];
				$sobrenome = $_arr[1];
				

	$insert_sql .= " ('".$nome."','".$sobrenome."')";
 

							sc_exec_sql($insert_sql);
							sc_alert("Registros Inseridos com Sucesso");

}
}
}
fclose($handle);
}

Arquivo.TXT
teste teste
teste1 teste1
teste2 teste2

Pode ser que voce de um trim para remover espaços e depois o explode no espaço, mas como foi removido não vai pegar.

Jair,

No caso do explode não tem caracter no txt é somente espaço. Acredito que teria que colocar um foreach para trazer todos os registros e não somente o primeiro.
É como ele pegasse somente o cabeçalho.

Não precisa do foreach, voce já tem o while

testei aqui e funciona bem, veja abaixo…

será que o sc_alert que colocou não interrompe depois do primeiro?
ou após o insert colocar sc_commit_trans()

<?php
$Arquivo = "arquivo.txt";

$teste = fopen ($Arquivo,"r");
while ($data = fgets($teste, 4096))
{
	$data = rtrim(ltrim($data));
	$_arr=explode(" ",$data);
	echo "<br>".$_arr[0]."-".$_arr[1];
}
fclose ($teste);
?>
1 Curtida

Em primeiro lugar Jair muito obrigado pela ajuda.

Troquei o While conforme vc sugeriu, mas infelizmente comigo não deu certo. Segue o código:

$_file=$this->Ini->path_doc."/".{arquivo};
$handle = @fopen($_file, “r”);
$_c1=0;
if ($handle) {
while ($buffer = fgets($handle, 4096)) {

    $buffer = trim(trim($buffer));
	$_arr=explode(" ",$buffer);

if (!empty($buffer) && strpos($buffer,“Total de Fun”)===False)
{
$_c1++;
if ($_c1==1)
{

$insert_sql = ‘INSERT INTO teste (’
.'nome,sobrenome) VALUES ';

				$nome = $_arr[0];
				$sobrenome = $_arr[1];
				

	$insert_sql .= " ('".$nome."','".$sobrenome."')";

// Inserir registros
sc_exec_sql($insert_sql);
//sc_alert(“Registros Inseridos com Sucesso”);

}
}
}
fclose($handle);
}

faz duas alterações

de : $buffer = trim(trim($buffer));
para : $buffer = ltrim(rtrim($buffer)); // LTRIM limpa a esquerda RTRIM limpa a direita

de : if ($_c1 ==1) //se colocar ==1 vai fazer apenas uma vez
para: if ($_c1> 0) //Fazer se a conta for maior que zero

1 Curtida

Perfeito funfou. Valeu Jair

1 Curtida

Jair,
Peguei o TXT que vem do Bradesco, e os espaços não é certinho e o nome da pessoa que fez o lançamento vem na segunda linha. Tem alguma solução para isso? Pensei em tabular com o caracter | mas imagina o trampo disso. Segue um exemplo do TXT

02/05/2022 TRANSF AUTORIZ ENTRE AGS 236968 500,00 800,00
Fulano
02/05/2022 TRANSFERENCIA PIX 813101 106,54 900,00
REMT: Ciclano
02/05/2022 TRANSFERENCIA PIX 953031 380,00 600,00
REMT: Beltrano

este txt talvez tenha quantidade de caracteres para cada campo, exemplo Data do 1 ao 10

ai tem que usar uma forma diferente, no lugar do explode teria que usar substr, se for isto tem que saber as posições de inicio e fim

no seu código mudaria:

se for tem que remover:
$buffer = trim(trim($buffer));
$_arr=explode(" ",$buffer);

e no lugar para cada informação utilizar substr, exemplo:
$data= substr($dados, 0, 9);

mas depende do arquivo, veja no banco qual o padrão que usam, pode ter um arquivo tipo CNAB de conciliação que nele tem a posição que deve usar

Jair me tira uma dúvida.

Como consigo gravar o segundo campo que está na segunda linha, dentro do segundo campo que está na primeira linha.

Ex:
02/05/2022 TRANSF AUTORIZ ENTRE AGS 236968 500,00 800,00
Fulano
02/05/2022 TRANSFERENCIA PIX 813101 106,54 900,00
REMT: Ciclano
02/05/2022 TRANSFERENCIA PIX 953031 380,00 600,00
REMT: Beltrano

Gostaria que o o Fulano, Ciclano e Beltrano entrasse no segundo campo da primeira linha. Ficaria assim.
02/05/2022 TRANSF AUTORIZ ENTRE AGS Fulano 236968 500,00 800,00
02/05/2022 TRANSFERENCIA PIX REMT: Ciclano 813101 106,54 900,00
02/05/2022 TRANSFERENCIA PIX REMT: Beltrano 953031 380,00 600,00

Fico muito grato pela sua ajuda que já ajudou bastante!

voce quem que separar cada pedaço e depois colocar da forma que quer.

para identificar a linha da data, uma forma simples seria verificar o primeiro caractere, se for numero ou não.

if(is_numeric(substr($data, 0,1)))  //se o primeiro caracter for um numero
{
    $linhaExibe = ""; // para limpar a cada nova data

    //pega cada campo
    $pegaData = 
    $pegaDescricao = 
    $pegaReferencia = 
    $pegaValor1 =
    $pegaValor2 =
}
else //Se não for a data vai estar na segunda linha, pega o nome e monta a exibição que quer
{
  $pegaNome = ...
  
   $linhaExibe = $pegaData." ".$pegaDescricao." ".$pegaNome." ".$pegaReferencia." ".$pegaValor1." ".$pegaValor2;
}

if($linhaExibe) //Se linha estiver preenchida exibe
    echo  "<br>".$linhaExibe;

ou pode só concatenar o resultado na variavel .= e exibir no final, ou acumular em um array ou salvar em uma tabela, tem varias formas, mas acho que a de cima seria a mais simples

testei aqui, funciona, só precisa separar os campos para colocar na posição que precisa, abaixo coloquei o nome no final

teste_dados.txt

02/05/2022 TRANSF AUTORIZ ENTRE AGS 236968 500,00 800,00
Fulano
02/05/2022 TRANSFERENCIA PIX 813101 106,54 900,00
REMT: Ciclano
02/05/2022 TRANSFERENCIA PIX 953031 380,00 600,00
REMT: Beltrano

exibe_dados.php

<?php
$Arquivo = "teste_dados.txt";

$teste = fopen ($Arquivo,"r");
while ($conteudo = fgets($teste, 4096))
{
	
	if(is_numeric(substr($conteudo, 0,1)))  //se o primeiro caracter for um numero
	{
		$linhaExibe = ""; // para limpar a cada nova data

		//pega cada campo
		$pegaData = $conteudo;
	}
	else //Se não for a data vai estar na segunda linha, pega o nome e monta a exibição que quer
	{
	  $pegaNome = $conteudo;
	  
	   $linhaExibe = $pegaData." ".$pegaNome;
	}

	if($linhaExibe) //Se linha estiver preenchida exibe
		echo  "<br>".$linhaExibe;
		
	
	
}
fclose ($teste);
?> 

Olá Jair,

Estou fazendo ainda a primeira parte de pegar os dados de acordo com os caracteres, mas não grava e fica um loop infinito.

$_file=$this->Ini->path_doc."/".{arquivo};
$handle = @fopen($_file, “r”);
$_c1=0;
if ($handle) {
while ($buffer = fgets($handle, 4096)) {

    $buffer = ltrim(rtrim($buffer));
	//$_arr=explode("|",$buffer);
	$data= substr($buffer, 0, 9);
	$lancamento= substr($buffer, 11, 17);
	$doc= substr($buffer, 19, 26);
	$credito= substr($buffer, 28, 34);
	$debito= substr($buffer, 36, 44);

if (!empty($buffer) && strpos($buffer,“Total de Fun”)===False)
{
$_c1++;
if ($_c1>0)
{

$insert_sql = ‘INSERT INTO bradesco (’
.'data,lancamento,doc,credito,debito,saldo) VALUES ';

				$data = $_arr[0];
				$lancamento = $_arr[1];
				$doc = $_arr[2];
				$credito = $_arr[3];
				$debito = $_arr[4];
				$saldo = $_arr[5];
				

	$insert_sql .= " ('".$data."','".$lancamento."','".$doc."','".$credito."','".$debito."','".$saldo."')";
 
						//echo $insert_sql;    // Olhar o SQL como foi montado

// Inserir registros
sc_exec_sql($insert_sql);
sc_alert(“Registros Inseridos com Sucesso”);

//echo ‘Select na empresa pelo max(id) e sessao=$_REQUEST[“PHPSESSID”]) e guarda o id da empresa
’;

//$_REQUEST[“id_empresa”];
/* $insert_sql = “SELECT LAST_INSERT_ID()”; // consulta
$con = mysql_query($insert_sql) or die ("PROBLEMAS COM A CONSULTA; ".mysql_error()); // enviamos a consulta ao SGBD
$res = mysql_fetch_row($con); // recuperamos o que for retornado em um array - $res

					 $res[0];*/
					
					
				 //echo $_empresaid;

//echo ‘==========================================================================================================
’;
//$_empresaid=$ds[0][0];

}
}
}
fclose($handle);
}

coloque seu codigo entre [ code ] [/ code]

[ code ]
codigo aqui
[/ code]

*sem os espaços, ele vai ficar mais fácil de visualizar

Segue

[ code ]
$_file=$this->Ini->path_doc."/".{arquivo};
$handle = @fopen($_file, “r”);
$_c1=0;
if ($handle) {
while ($buffer = fgets($handle, 4096)) {

    //$buffer = ltrim(rtrim($buffer));
	//$_arr=explode("|",$buffer);
	$data= substr($buffer, 0, 9);
	//$lancamento= substr($buffer, 11, 17);
	//$doc= substr($buffer, 19, 26);
	//$credito= substr($buffer, 28, 34);
	//$debito= substr($buffer, 36, 44);

if (!empty($buffer) && strpos($buffer,“Total de Fun”)===False)
{
$_c1++;
if ($_c1>0)
{

$insert_sql = ‘INSERT INTO bradesco (’
.'data,lancamento,doc,credito,debito,saldo) VALUES ';

				$data = $_arr[0];
				$lancamento = $_arr[1];
				$doc = $_arr[2];
				$credito = $_arr[3];
				$debito = $_arr[4];
				$saldo = $_arr[5];
				

	$insert_sql .= " ('".$data."','".$lancamento."','".$doc."','".$credito."','".$debito."','".$saldo."')";
 
						//echo $insert_sql;    // Olhar o SQL como foi montado

// Inserir registros
sc_exec_sql($insert_sql);
sc_alert(“Registros Inseridos com Sucesso”);

}
}
}
fclose($handle);
}
[/ code]

Olá, o [code ] [/ code] era sem espaços…

Se não esta gravando de uma olhada no if que verifica, o looping pode ser algo ref ao arquivo, ou esta em branco ou não localizado

tente colocar antes de iniciar um if com file_exists para verificar se realmente o arquivo existe