Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marcelo Guedes

Importar txt

Recommended Posts

Olá a todos, mais uma vez peço a ajuda de vocês tenho um arquivo txt com o seguinte layout:

 

*2001

7894900010015 150

7894900010020 300

7899400500465 050

7894643812312 100

*2002

7894900016156 035

7894881561861 011

7894860450002 001

*2003

7894868153183 335

7898456484411 200

...

 

Eu consegui importá-lo linha por linha ou usando o substr mas gostaria que fosse importado da seguinte maneira para a tabela codigos com as colunas lote, ean e qty

 

lote ean Qty

*2001 7894900010015 150

7894900010020 300

7899400500465 050

7894643812312 100

*2002

7894900016156 035

7894881561861 011

7894860450002 001

*2003

7894868153183 335

7898456484411 200

 

Pois bem acho que deveria usar expressões regulares mas não consegui uma se alguém puder me ajudar ficarei grato

 

Então quando a linha contiver "*" sera gravado na coluna lote e as demais na coluna "ean" e "qty"

até a próxima linha que contenha novamente o "*" daí começaria um novo registro, lembrando que as linhas não são fixas e os números que estão entre os * também não.

 

Grato Marcelo Guedes

Compartilhar este post


Link para o post
Compartilhar em outros sites

tentei escrver um simples exemplo, mas a coisa em si é tão simples que fiz "tudo"..

 


Leia o arquivo usando a função file()

 

$arr = file( 'arquivo.txt' );

http://php.net/file

 

 

 

 

 

Então faça uma iteração com os filtros que deseja..

 

 

foreach( $arr as $v )
{

    // filtro para remover espaços duplicados.
    // se o caracter separador for tab, não precisa disso... obviamente..
    $v = preg_replace( '!\s+!', ' ', $v );

    // se encontrar o asterisco, indica que é o numero do lote.
    if( substr( $v, 0, 1 ) == '*' )
    {
        $y = substr( $v,1, 4 ); // o lote
        $rs[$y] = array(); // instancia um array cujo índice é o numero do lote
    }

    // atribui os outros 2 "campos" como um array
    $rs[$y] = explode( ' ', substr( $v, 6 ) );

}

// debugando o resultado:
print_r( $rs );

http://php.net/preg_replace

http://php.net/substr

http://php.net/explode

http://php.net/print_r

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Hinon sei que fiz algo de errado:

 

 

 

<?php
//$tabela = "funcionario";
$db = @mysql_connect ("localhost", "teste", "teste");
mysql_select_db("inventario",$db);
$rs = file("prod.txt");
foreach( $rs as $v )
{
$v = preg_replace( '!\s+!', ' ', $v );
if( substr( $v, 0, 1 ) == '*' )
{
$y = substr( $v,1, 4 ); // o lote
$rs[$y] = array();
}
$rs[$y] = explode( ' ', substr( $v, 13 ) );
}
print_r( $rs );
?>

 

 

e esta me retornando isso:

 

esta quase o que eu quero, rsrssrs

 

 

Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001] => Array ( [0] => [1] => 100 [2] => ) [2002] => Array ( [0] => [1] => 001 [2] => ) [2003] => Array ( [0] => [1] => 200 [2] => ) )

Compartilhar este post


Link para o post
Compartilhar em outros sites

imaginei que pudesse cair nisso:

 

2001 [1] => 7894900010015 150 [2] => 7894900010020 300

 

não está separando o terceiro campo né.

 

como mencionei acima, verifique se o caracter separador é SPACE ou TAB...

Compartilhar este post


Link para o post
Compartilhar em outros sites
esse é o arquivo txt o terceiro campo está separado por espaço

 

 

*2001
7894900010015 150
7894900010020 300
7899400500465 050
7894643812312 100
*2002
7894900016156 035
7894881561861 011
7894860450002 001
*2003
7894868153183 335
7898456484411 200

 

e esse é o resultado mesmo que não esteja separando o terceiro campo mesmo assim a partir do campo *2003 começa a repetir o campo 2001 mas apenas com o campo 3 que eu identifiquei em azul e o que está em vermelho seria apenas o que corresponde ao arquivo txt

 

 

 

Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001] => Array ( [0] => [1] => 100 [2] => ) [2002] => Array ( [0] => [1] => 001 [2] => ) [2003] => Array ( [0] => [1] => 200 [2] => ) )

 

e mesmo separando o txt com space ou tab ainda continua a não separar o terceiro campo

 

agradeço a paciência e a ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

nesse trecho

 

    // se encontrar o asterisco, indica que é o numero do lote.
    if( substr( $v, 0, 1 ) == '*' )
    {
        $y = substr( $v,1, 4 ); // o lote
        $rs[$y] = array(); // instancia um array cujo índice é o numero do lote
    }

    // atribui os outros 2 "campos" como um array
    $rs[$y] = explode( ' ', substr( $v, 6 ) );

 

troque por isso:

 

 

    // se encontrar o asterisco, indica que é o numero do lote.
    if( substr( $v, 0, 1 ) == '*' )
    {
        $y = substr( $v,1, 4 ); // o lote
        $rs[$y] = array(); // instancia um array cujo índice é o numero do lote
    }else{
        // atribui os outros 2 "campos" como um array
        $rs[$y]['ean'] = substr( $v, 0, 13 );
        $rs[$y]['qtd'] = trim( substr( $v, 14 ) );
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

O resultado agora foi esse

 

 

Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( ) ) Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( [ean] => 7894900010015 [qtd] => 150 ) ) Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( [ean] => 7894900010020 [qtd] => 300 ) ) Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( [ean] => 7899400500465 [qtd] => 050 ) ) Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( [ean] => 7894643812312 [qtd] => 100 ) ) Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( [ean] => 7894643812312 [qtd] => 100 ) [2002 ] => Array ( ) ) Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( [ean] => 7894643812312 [qtd] => 100 ) [2002 ] => Array ( [ean] => 7894900016156 [qtd] => 035 ) ) Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( [ean] => 7894643812312 [qtd] => 100 ) [2002 ] => Array ( [ean] => 7894881561861 [qtd] => 011 ) ) Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( [ean] => 7894643812312 [qtd] => 100 ) [2002 ] => Array ( [ean] => 7894860450002 [qtd] => 001 ) ) Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( [ean] => 7894643812312 [qtd] => 100 ) [2002 ] => Array ( [ean] => 7894860450002 [qtd] => 001 ) [2003 ] => Array ( ) ) Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( [ean] => 7894643812312 [qtd] => 100 ) [2002 ] => Array ( [ean] => 7894860450002 [qtd] => 001 ) [2003 ] => Array ( [ean] => 7894868153183 [qtd] => 335 ) ) Array ( [0] => *2001 [1] => 7894900010015 150 [2] => 7894900010020 300 [3] => 7899400500465 050 [4] => 7894643812312 100 [5] => *2002 [6] => 7894900016156 035 [7] => 7894881561861 011 [8] => 7894860450002 001 [9] => *2003 [10] => 7894868153183 335 [11] => 7898456484411 200 [2001 ] => Array ( [ean] => 7894643812312 [qtd] => 100 ) [2002 ] => Array ( [ean] => 7894860450002 [qtd] => 001 ) [2003 ] => Array ( [ean] => 7898456484411 [qtd] => 200 ) )

 

 

E desculpe minha insistência é que estou um pouco perdido neste código, obrigado mais uma vez

Compartilhar este post


Link para o post
Compartilhar em outros sites

poste esse array com a formatação texto original..

 

no browser, quando ver o resultado, mande abrir o código fonte. No chrome é CTRL+U...

 

copie a passe aqui.. é que estou com preguiça de ficar olhando esse espaguete de array que vc postou. hehehe

mas sei o que ocorre.. só quero te ensinar a pegar o peixe ao inve´s de entregar de graça..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue abaixo o que você pediu:

 

 

 

Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
)
)
Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
[ean] => 7894900010015
[qtd] => 150
)
)
Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
[ean] => 7894900010020
[qtd] => 300
)
)
Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
[ean] => 7899400500465
[qtd] => 050
)
)
Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
[ean] => 7894643812312
[qtd] => 100
)
)
Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
[ean] => 7894643812312
[qtd] => 100
)
[2002 ] => Array
(
)
)
Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
[ean] => 7894643812312
[qtd] => 100
)
[2002 ] => Array
(
[ean] => 7894900016156
[qtd] => 035
)
)
Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
[ean] => 7894643812312
[qtd] => 100
)
[2002 ] => Array
(
[ean] => 7894881561861
[qtd] => 011
)
)
Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
[ean] => 7894643812312
[qtd] => 100
)
[2002 ] => Array
(
[ean] => 7894860450002
[qtd] => 001
)
)
Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
[ean] => 7894643812312
[qtd] => 100
)
[2002 ] => Array
(
[ean] => 7894860450002
[qtd] => 001
)
[2003 ] => Array
(
)
)
Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
[ean] => 7894643812312
[qtd] => 100
)
[2002 ] => Array
(
[ean] => 7894860450002
[qtd] => 001
)
[2003 ] => Array
(
[ean] => 7894868153183
[qtd] => 335
)
)
Array
(
[0] => *2001
[1] => 7894900010015 150
[2] => 7894900010020 300
[3] => 7899400500465 050
[4] => 7894643812312 100
[5] => *2002
[6] => 7894900016156 035
[7] => 7894881561861 011
[8] => 7894860450002 001
[9] => *2003
[10] => 7894868153183 335
[11] => 7898456484411 200
[2001 ] => Array
(
[ean] => 7894643812312
[qtd] => 100
)
[2002 ] => Array
(
[ean] => 7894860450002
[qtd] => 001
)
[2003 ] => Array
(
[ean] => 7898456484411
[qtd] => 200
)
)

 

 

Marquei esta parte em vermelho pois essa é a parte que contem no txt o que vem depois esta repetido

 

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

#10 se liga mané.. sai fora..

 

 

 

#9, cara que zuado... poste o código que vc modificou..

Não entendi por que saiu tudo isso dessa forma bagunçada. Acho que vc confundiu algo nessa última alteração.;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente meu caro refiz o código e o resultado agora deu certo porém só esta pegando a última linha de cada lote

 

 

 

<?php
$arr = file( 'prod.txt' );
foreach( $arr as $v )
{
// filtro para remover espaços duplicados.
// se o caracter separador for tab, não precisa disso... obviamente..
$v = preg_replace( '!\s+!', ' ', $v );
// se encontrar o asterisco, indica que é o numero do lote.
if( substr( $v, 0, 1 ) == '*' )
{
$y = substr( $v,1, 4 ); // o lote
$rs[$y] = array(); // instancia um array cujo índice é o numero do lote
}else{
// atribui os outros 2 "campos" como um array
$rs[$y]['ean'] = substr( $v, 0, 13 );
$rs[$y]['qtd'] = trim( substr( $v, 14 ) );
}
}
// debugando o resultado:
print_r( $rs );
?>

 

e o resultado:

 

 

 

Array
(
[2001] => Array
(
[ean] => 7894643812312
[qtd] => 100
)
[2002] => Array
(
[ean] => 7894860450002
[qtd] => 001
)
[2003] => Array
(
[ean] => 7898456484411
[qtd] => 200
)
)

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php

$data = '*2001
7894900010015 150
7894900010020 300
7899400500465 050
7894643812312 100
*2002
7894900016156 035
7894881561861 011
7894860450002 001
*2003
7894868153183 335
7898456484411 200';

function Parse($data) {
	foreach(explode(PHP_EOL, $data) as $line) //separa os dados em linhas e intera sobre elas
		if($line[0] == '*') //verifica se é a linha que indica o lote
			$lote = substr($line, 1); //define o lote atual
		else {
			list($e['ean'], $e['qty']) = explode(' ', $line); //lê o "ean" e o "qty";
			$result[$lote][] = $e; //adiciona o registro ao lote
		}

	return $result;
}

function Parse2($data) {
	foreach(explode(PHP_EOL, $data) as $line) //separa os dados em linhas e intera sobre elas
		if($line[0] == '*') //verifica se é a linha que indica o lote
			$lote = substr($line, 1); //define o lote atual
		else {
			list($e['ean'], $e['qty']) = explode(' ', $line); //lê o "ean" e o "qty";
			$e['lote'] = $lote; //define o lote com o valor do lote atual
			$result[] = $e; //adiciona o registro ao resultado
		}

	return $result;
}


print_r(Parse($data));

print_r(Parse2($data));

Fiz duas versões super simples, sem nenhum tratamento de erros.

 

Espero que ajude você a resolver seu problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

funcionou legal porém como faço com um txt

Bem aqui esta oque eu fiz com a ajuda de vocês e que deu certo :

 

 

 

<?php

$arr = file( 'prod.txt' );

 

foreach($arr as $line) //separa os dados em linhas e intera sobre elas

if($line[0] == '*') //verifica se é a linha que indica o lote

$lote = substr($line, 1); //define o lote atual

else {

list($e['ean'], $e['qty']) = explode(' ', $line); //lê o "ean" e o "qty";

$result[$lote][] = $e; //adiciona o registro ao lote

}

 

// debugando o resultado:

print_r( $result );

?>

 

agora pra fechar com chave de ouro, como ponho isso no mysql

Tentei alguns insert aqui porém so gravou a ultima linha do txt

Compartilhar este post


Link para o post
Compartilhar em outros sites

#12..

 

era só corrigir esse trecho

 

 

 

$rs[$y]['ean'] = substr( $v, 0, 13 );
$rs[$y]['qtd'] = trim( substr( $v, 14 ) );

por

 

$rs[$y][]['ean'] = substr( $v, 0, 13 );
$rs[$y][]['qtd'] = trim( substr( $v, 14 ) );

 

 

Para gravar no banco, basta iterar o resultado do array..

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

<?php
$tabela = "teste";
$db = @mysql_connect ("localhost", "root", "root");
mysql_select_db("visitas",$db);
$arr = file( 'prod.txt' );
foreach( $arr as $v )
{
// filtro para remover espaços duplicados.
// se o caracter separador for tab, não precisa disso... obviamente..
$v = preg_replace( '!\s+!', ' ', $v );
// se encontrar o asterisco, indica que é o numero do lote.
if( substr( $v, 0, 1 ) == '*' )
{
$lote = $y = substr( $v,1, 4 ); // o lote
$rs[$y] = array(); // instancia um array cujo índice é o numero do lote
}else{
// atribui os outros 2 "campos" como um array
$ean = $rs[$y][]['ean'] = substr( $v, 0, 13 );
$qtd = $rs[$y][]['qtd'] = trim( substr( $v, 14 ) ); }
}
$sql = "INSERT INTO teste (lote, ean, quantidade) VALUES(\"$lote\",\"$ean\",\"$qtd\")";
mysql_query($sql,$db) or die(mysql_error());
echo "<pre>";
print_r( $rs );
echo "<pre>";
print_r($rs);
?>

 

essa foi uma das minhas tentativas, kkkkkk

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.