Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Saudação à todos!
Me deparei com uma situação que não sei como resolver.
1º Usando PHP, preciso escolher um TXT de uma pasta do computador local e transferir para o provedor.
2º No provedor, (pelo sistema em PHP) selecionar determinado arquivo (todos terão nomes diferentes)
3º Abrir e gravar em uma tabela
Obs: Abrir e gravar, sei como fazer, porem não posso definir um nome fixo para abrir, já que são vários arquivos com nomes aleatórios.
Ex: Localmente terei Aquivo1, Arquivo2, Arquivo3 ........ envio todos para o provedor. Lá vou abrindo um a um, mas a rotina para abrir terá que ler o nome e renomear para o nome padrão definido pelo programa.
Aguardo ajuda de alguem e espero ter explicado o que preciso.
Abraço à todos.
Olá Quelipe
Seu exemplo mostrou os arquivos, porém tudo na horizontal.
O que preciso é que mostre como no explorer e que clicando no arqivo, envie para endereço remoto, pois é lá que vou efetivamente abrir o arquivo, ler e gravar em tabela.
Se você tiver um exemplo, fico muito agradecido.
Até+
Então, agora é só fazer a leitura de cada um e gravar.
at+
Quelipe, acho que não consegui explicar direito:
preciso enviar um TXT local para um provedor onde está o banco de dados e o sistema (www.provedor.com.br/public_html)
Aí pelo sistema, tenho que escolher qual TXT vou ler, para transformar seus registros e gravar em tabela do MySQL.
Seria como um FTP embutido em rotina em PHP
Tem como fazer ?
Ok jorgeN, você tem tal txt, precisa enviar ele em certo momento.
Pra o servidor FTP que lá vai transformar ele em registros ?
Ou você precisa ler um diretorio local, encontrar todos os arquivos
TXT, mandar pro servidor externo ( FTP ) é transformar em registros ?
Eu entendi foi o seguinte:
Você tem um diretorio com vários arquivos txt ..
e precisa extrair o conteúdo de cada um deles, então eu montei meu esquema assim
/applications/core/interface/imageproxy/imageproxy.php?img=http://static.mbiosinformatica.com.br/tree.jpg&key=61c5da3be9877a6efd356f51b393220a107f0f6c8ad2af33d0f76c919155c614" alt="tree.jpg" />
em cada txt, eu tenho o seguinte conteúdo
linha1|linha1|linha1|linha1|arquivo0
linha2|linha2|linha2|linha2|arquivo0
linha3|linha3|linha3|linha3|arquivo0
linha4|linha4|linha4|linha4|arquivo0
linha5|linha5|linha5|linha5|arquivo0
linha6|linha6|linha6|linha6|arquivo0
linha7|linha7|linha7|linha7|arquivo0
linha8|linha8|linha8|linha8|arquivo0
o arquivo0, não é necessário, coloquei só de exemplo
é então, já que e a sua duvida, montar o insert na tabela com o conteúdo desses arquivos
o código ficou assim:
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8858-1" />
</head>
<body>
<?php
foreach( glob( 'txt/*.txt' ) as $arquivo ){
$fp = fopen( $arquivo, 'r+' );
while( $txt = fscanf( $fp, '%s' ) ){
$dados[ preg_replace( '/txt\//', null, $arquivo ) ][] = reset( $txt );
}
}
echo '<pre>';
foreach( array_filter( $dados ) as $key => $data ){
for( $i = 0; $i < sizeOf( $dados[ $key ] ); ++$i ){
$contents[ $key ][ $i ] = explode( '|', $dados[ $key ][ $i ] );
}
}
foreach( $contents as $index => $data ){
for( $x = 0; $x < sizeOf( $data ); ++$x ){
$valores[ $index ][] = '('. implode( ',', $contents[ $index ][ $x ] ).')';
}
}
for( $j = 0; $j < sizeOf( $valores ); ++$j ){
foreach( $valores as $key => $data ){
$SQL[] = $data[ $j ];
}
}
echo 'INSERT INTO `...`( ... ) VALUES',implode( ',', array_filter( $SQL ) );
?>
</body>
</html>
o Retorno foi:
INSERT INTO ...( ... ) VALUES
(linha1,linha1,linha1,linha1,arquivo0),(linha1,linha1,linha1,linha1,arquivo1),
(linha1,linha1,linha1,linha1,arquivo2),(linha1,linha1,linha1,linha1,arquivo3),
(linha1,linha1,linha1,linha1,arquivo4),(linha1,linha1,linha1,linha1,arquivo5),
(linha1,linha1,linha1,linha1,arquivo6),(linha1,linha1,linha1,linha1,arquivo7),
(linha1,linha1,linha1,linha1,arquivo8),(linha1,linha1,linha1,linha1,arquivo9),
(linha2,linha2,linha2,linha2,arquivo0),(linha2,linha2,linha2,linha2,arquivo1),
(linha2,linha2,linha2,linha2,arquivo2),(linha2,linha2,linha2,linha2,arquivo3),
(linha2,linha2,linha2,linha2,arquivo4),(linha2,linha2,linha2,linha2,arquivo5),
(linha2,linha2,linha2,linha2,arquivo6),(linha2,linha2,linha2,linha2,arquivo7),
(linha2,linha2,linha2,linha2,arquivo8),(linha2,linha2,linha2,linha2,arquivo9),
(linha3,linha3,linha3,linha3,arquivo0),(linha3,linha3,linha3,linha3,arquivo1),
(linha3,linha3,linha3,linha3,arquivo2),(linha3,linha3,linha3,linha3,arquivo3),
(linha3,linha3,linha3,linha3,arquivo4),(linha3,linha3,linha3,linha3,arquivo5),
(linha3,linha3,linha3,linha3,arquivo6),(linha3,linha3,linha3,linha3,arquivo7),
(linha3,linha3,linha3,linha3,arquivo8),(linha3,linha3,linha3,linha3,arquivo9),
(linha4,linha4,linha4,linha4,arquivo0),(linha4,linha4,linha4,linha4,arquivo1),
(linha4,linha4,linha4,linha4,arquivo2),(linha4,linha4,linha4,linha4,arquivo3),
(linha4,linha4,linha4,linha4,arquivo4),(linha4,linha4,linha4,linha4,arquivo5),
(linha4,linha4,linha4,linha4,arquivo6),(linha4,linha4,linha4,linha4,arquivo7),
(linha4,linha4,linha4,linha4,arquivo8),(linha4,linha4,linha4,linha4,arquivo9),
(linha5,linha5,linha5,linha5,arquivo0),(linha5,linha5,linha5,linha5,arquivo1),
(linha5,linha5,linha5,linha5,arquivo2),(linha5,linha5,linha5,linha5,arquivo3),
(linha5,linha5,linha5,linha5,arquivo4),(linha5,linha5,linha5,linha5,arquivo5),
(linha5,linha5,linha5,linha5,arquivo6),(linha5,linha5,linha5,linha5,arquivo7),
(linha5,linha5,linha5,linha5,arquivo8),(linha5,linha5,linha5,linha5,arquivo9),
(linha6,linha6,linha6,linha6,arquivo0),(linha6,linha6,linha6,linha6,arquivo1),
(linha6,linha6,linha6,linha6,arquivo2),
(linha6,linha6,linha6,linha6,arquivo3),(linha6,linha6,linha6,linha6,arquivo4),
(linha6,linha6,linha6,linha6,arquivo5),(linha6,linha6,linha6,linha6,arquivo6),
(linha6,linha6,linha6,linha6,arquivo7),(linha6,linha6,linha6,linha6,arquivo8),
(linha6,linha6,linha6,linha6,arquivo9),(linha7,linha7,linha7,linha7,arquivo0),
(linha7,linha7,linha7,linha7,arquivo1),(linha7,linha7,linha7,linha7,arquivo2),
(linha7,linha7,linha7,linha7,arquivo3),(linha7,linha7,linha7,linha7,arquivo4),
(linha7,linha7,linha7,linha7,arquivo5),(linha7,linha7,linha7,linha7,arquivo6),
(linha7,linha7,linha7,linha7,arquivo7),(linha7,linha7,linha7,linha7,arquivo8),
(linha7,linha7,linha7,linha7,arquivo9),(linha8,linha8,linha8,linha8,arquivo0),
(linha8,linha8,linha8,linha8,arquivo1),(linha8,linha8,linha8,linha8,arquivo2),
(linha8,linha8,linha8,linha8,arquivo3),(linha8,linha8,linha8,linha8,arquivo4),
(linha8,linha8,linha8,linha8,arquivo5),(linha8,linha8,linha8,linha8,arquivo6),
(linha8,linha8,linha8,linha8,arquivo7),(linha8,linha8,linha8,linha8,arquivo8),
(linha8,linha8,linha8,linha8,arquivo9)
Creio que agora, com um pouco de esforço, você dê uma estudada na forma que eu fiz
pra você chegar ao resultado que você deseja ..
@Quelipe, não precisa disso, você pode usar um glob
que vai retornar o path de todos os arquivos
normalmente ! ;)
Obrigado.
Vou estudar o código. É bem isso que preciso. Agora é só adequar.
Só está dando um erro na linha $dados usando preg_replace, mas vou analisar e entender melhor.
Obrigado pela força.
Qual erro ?
Aqui onde você definiu como txt conforme seu exemplo, troquei por loja_des que é a pasta onde estão os arquivos
Alterei também na linha após o while.
Como eu não entendo o preg_replace é que estou com dificuldade.
Outro detalhe, é que mais adiante você tem a variavel $data que não é definida, porém o erro ainda é na linha 27 por enquanto.
foreach( glob( 'loja_des/*.txt' ) as $arquivo ){
$fp = fopen( $arquivo, 'r+' );
while( $txt = fscanf( $fp, '%s' ) ){
$dados[ preg_replace( '/loja_des\//', null, $arquivo ) ][] = reset( $txt );
Notice: Undefined variable: dados in C:\Arquivos de programas\EasyPHP 2.0b1\www\lendotexto.php on line 27
em razão deste erro, os demais são consequencia
Warning: Invalid argument supplied for foreach() in C:\Arquivos de programas\EasyPHP 2.0b1\www\lendotexto.php on line 27
Notice: Undefined variable: contents in C:\Arquivos de programas\EasyPHP 2.0b1\www\lendotexto.php on line 32
Warning: Invalid argument supplied for foreach() in C:\Arquivos de programas\EasyPHP 2.0b1\www\lendotexto.php on line 32
Notice: Undefined variable: valores in C:\Arquivos de programas\EasyPHP 2.0b1\www\lendotexto.php on line 37
aqui eu não tratei ainda
INSERT INTO ...( ... ) VALUES
Notice: Undefined variable: SQL in C:\Arquivos de programas\EasyPHP 2.0b1\www\lendotexto.php on line 42
Warning: array_filter() [function.array-filter]: The first argument should be an array in C:\Arquivos de programas\EasyPHP 2.0b1\www\lendotexto.php on line 42
Warning: implode() [function.implode]: Bad arguments. in C:\Arquivos de programas\EasyPHP 2.0b1\www\lendotexto.php on line 42
Na verdade, estou apanhando por não ter dominio deste detalhe
Se você tiver solução, fico imensamente agradecido.
Isso e porque parece não ter nenhum conteúdo delimitado por | em seus txt's, você visualizou o formato que eu postei ?
Andrey
Criei o TXT conforme seu exemplo, mas não vai.
Vou ter que estudar bem este assunto.
Agradeço muito pela atenção que você deu.
Cara, muito estranho ..
Eu testei com o nome do txt que você deu, e funcionou perfeitamente ..
Roda o seguinte código ai:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title></title>
</head>
<body>
<?phpCONTEUDO;
for( $i = 0; $i < 11; ++$i ){
file_put_contents( "loja_des/arquivo$i.txt", $conteudo );
echo 'Escrevendo no arquivo'.$i.'.txt', '<br />';
}
?>
</body>
</html>
Antes copia tudo que você tem na pasta, deixe a pasta vazia pro PHP
escrever nos arquivos lá dentro
Então depois que ele criar 10 arquivos dentro dessa pasta, execute o código:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title></title>
</head>
<body>
<?php
$glob = glob( 'loja_des/*.txt' );
foreach( $glob as $arquivo ){
if( count( $glob ) == 0 ){
echo 'Não existe nenhum arquivo para ser processado';
break;
}
$fp = fopen( $arquivo, 'r+' );
while( $txt = fscanf( $fp, '%s' ) ){
$dados[ $arquivo ][] = reset( $txt );
}
}
echo '<pre>';
foreach( array_filter( $dados ) as $key => $data ){
for( $i = 0; $i < sizeOf( $dados[ $key ] ); ++$i ){
$contents[ $key ][ $i ] = explode( '|', $dados[ $key ][ $i ] );
}
}
foreach( $contents as $index => $data ){
for( $x = 0; $x < sizeOf( $data ); ++$x ){
$valores[ $index ][] = '('. implode( ',', $contents[ $index ][ $x ] ).')';
}
}
for( $j = 0; $j < sizeOf( $valores ); ++$j ){
foreach( $valores as $key => $data ){
$SQL[] = $data[ $j ];
}
}
echo 'INSERT INTO `...`( ... ) VALUES',implode( ',', array_filter( $SQL ) );
?>
</body>
</html>
Minha saída foi a seguinte:
INSERT INTO ...( ... ) VALUES
(item1,item2,item3,item4),(item1,item2,item3,item4),(item1,item2,item3,item4),
(item1,item2,item3,item4),(item1,item2,item3,item4),(item1,item2,item3,item4),
(item1,item2,item3,item4),(item1,item2,item3,item4),(item1,item2,item3,item4),
(item1,item2,item3,item4),(item1,item2,item3,item4),(item1,item2,item3,item4),
(item1,item2,item3,item4),(item1,item2,item3,item4),(item1,item2,item3,item4),
(item1,item2,item3,item4),(item1,item2,item3,item4),(item1,item2,item3,item4),
(item1,item2,item3,item4),(item1,item2,item3,item4),(item1,item2,item3,item4),
(item1,item2,item3,item4)
Não vai mesmo. Entrego os pontos. Agora dá esse erro:
Warning: file_put_contents(loja_des/arquivo0.txt) [function.file-put-contents]: failed to open stream: No such file or directory in C:\Arquivos de programas\EasyPHP 2.0b1\www\andrey.php on line 12
Escrevendo no arquivo0.txt
Deve ser relacionado com a função.
Não, você tem o diretorio loja_des criado ?
Sim, criei arquivo0 e arquivo1 na pasta loja_des e na pasta mferrari
Testei com as duas pastas
$glob = glob( 'MFerrari/*.txt' );
foreach( $glob as $arquivo ){
if( count( $glob ) == 0 ){
echo 'Não existe nenhum arquivo para ser processado';
VEJA QUE NESTA LINHA PASSA. O QUE ENTENDO É QUE ENCONTROU OS ARQUIVOS
break;
}
$fp = fopen( $arquivo, 'r+' );
while( $txt = fscanf( $fp, '%s' ) ){
$dados[ $arquivo ][] = reset( $txt );
}
}
echo '<pre>';
AQUI DOU UM ECHO EM $DADOS, MAS NADA MOSTRA, OU SEJA, NESTE WHILE NADA É DEFINIDO
foreach( array_filter( $dados ) as $key => $data ){
O ERRO DÁ NESTA LINHA
Notice: Undefined variable: dados in C:\Arquivos de programas\EasyPHP 2.0b1\www\andrey.php on line 24
Por não entender a lógica deste código é que estou ficando doido já. Os arquivos TXT estão como você definiu. Não entendo porque só para você dá certo.
Vou continuar estudando esse seu exemplo até dar certo. Deve ser um detalhe pequeno.
Agradeço muito sua atenção.
@Andrey Knupp
Script testado e funcionando.
@jorgeN
Talvez você esteja fazendo algo errado.
Kara, to quase afirmando que isso é problema do teu servidor
Eu testei em 2 Servidores, no local e externo, ate registrei os dados
retornados no banco de dados do servidor externo e foi certinho ..
Você já tentou instalar o PHP Manualmente sem ser esse pacotes ?
Ou usar um pacote diferente, tipo XAMPP ? Wampp :o
Se você estiver colocando os arquivos dentro de uma determinada pasta, basta ler o conteúdo dela.
$open = opendir($pasta); // pasta que estão os arquivos
while(false !==($arquivo = readdir($open))) {
at+