Jump to content

[Resolvido] Importar ficheiros .txt para Base de Dados


ivan919

Recommended Posts

Boas 🙂

Tenho que importar dados de um ficheiro .txt para a base de dados.

Estou com problemas em inserir os dados nas colunas.

O ficheiro txt tem este formato:

Dan McGauhey 12

Ana Dinis 21

Pedro Branco 43

Tenho que introduzir o firstname, lastname e age

Na base de dados ficaria:

id firstname lastname age

1 Dan McGauhey 12

2 Ana Dinis 21

3 Pedro Branco 43

Mas o que me esta a acontecer é:

id firstname lastname age

1 D M 1

2 A D 2

3 P B 4

Ou seja so a primeira letra/numero de cada palavra é que esta a ser inserida na BD

Eu arranjei o código na internet pois nao estava a conseguir chegar lá sozinho mas fiz algumas alterações para se adaptar ao meu que nem varios valores dava para introduzir!

o codigo:

<?php
include "init.php";
$arquivo = "./Importar/teste.txt";
$arq = fopen($arquivo,'r');
while(!feof($arq))
$linha[] = fgets($arq); // cria um array com o conteudo do arquivo
//até aqui você tem o vetor com cada linha ("teste1 teste2","teste3 teste4", ...), e não com cada palavra.
//separando as palavras nas linhas
for($c = 0; $c < sizeof($linha); $c++){
$handle = explode(" ",$linha[$c]); //quebra a linha aonde achar o |
for($a = 0; $a < sizeof($handle); $a++){
$linha[$c][$a] = $handle[$a]; //primeira palavra
$linha[$c][$a] = $handle[$a]; //segunda palavra
$linha[$c][$a] = $handle[$a]; //terceira palavra
}
}
//agora você tem um vetor com vetores das palavras (não sei se ficou claro isso, mas isso que acontece)
//cada posição do vetor $linha tem um outro vetor com as palavras. por isso tem dois índices.
//ex: $linhas[5][0]
//esse exemplo significa que ele vai pegar a 6º linha e a 1º palavra. (lembre-se que a contagem começa do 0.//faz um loop pra inserir todas as linhas, e não só a primeira, como tava antes.
for($c = 0; $c < sizeof($linha); $c++){
$sql = "INSERT INTO persons (firstName, lastName, age) VALUES ('".$linha[$c][0]."', '".$linha[$c][1]."', '".$linha[$c][2]."')";
$result = mysql_query($sql) or die(mysql_error());
}?>

Alguém me consegue ajudar? :X

Link to comment
Share on other sites

não estás a ler bem o teu próprio código

o que vejo é isto

for($c = 0; $c < sizeof($linha); $c++){ // para cada elemento do array de linhas (para cada linha)
 $handle = explode(" ",$linha[$c]); //quebra a linha aonde achar o caracter " "
 for($a = 0; $a < sizeof($handle); $a++){ // de $a que vai de 0 ao número de elementos separados (palavras)
   $linha[$c][$a] = $handle[$a];
   $linha[$c][$a] = $handle[$a];
   $linha[$c][$a] = $handle[$a];
   // três linhas iguais só significa uma coisa : estão duas a mais
 }
}

mas o teu problema é este :

$linha[$c][$a];

o elemento na posição $c não é um array mas sim uma string !!!

que por acaso no php podesse apicar o operador []

o que acontece é que estás a dizer que o caracter na posição $a da string do array é uma string ... o php deve se passar com isso o que vai dar a tua situação

o que deverias ter era um segundo array onde irias guardar a tua informação para não andares a mexer no array $linhas

ps :

- tens de ter cuidado com o explode porque a seguinte string "teste teste " resulta no segunite array:

array(0 => "teste", 1 => "teste", 2 => "");

isto devido ao espaço final

- se fosse eu, ia criar directamente o SQL

for($c = 0; $c < sizeof($linha); $c++){
 $handle = explode(" ",$linha[$c]); //quebra a linha aonde achar o |
 if (count($handler) == 3) { // validar o número de elementos lidos
   $sql = "INSERT INTO persons (firstName, lastName, age) VALUES ('{$handler[0]}', '{$handler[1]}', '{$handler[2]}')";
   $result = mysql_query($sql) or die(mysql_error());
 }
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

não estás a ler bem o teu próprio código

o que vejo é isto

for($c = 0; $c < sizeof($linha); $c++){ // para cada elemento do array de linhas (para cada linha)
 $handle = explode(" ",$linha[$c]); //quebra a linha aonde achar o caracter " "
 for($a = 0; $a < sizeof($handle); $a++){ // de $a que vai de 0 ao número de elementos separados (palavras)
$linha[$c][$a] = $handle[$a];
$linha[$c][$a] = $handle[$a];
$linha[$c][$a] = $handle[$a];
// três linhas iguais só significa uma coisa : estão duas a mais
 }
}

mas o teu problema é este :

$linha[$c][$a];

o elemento na posição $c não é um array mas sim uma string !!!

que por acaso no php podesse apicar o operador []

o que acontece é que estás a dizer que o caracter na posição $a da string do array é uma string ... o php deve se passar com isso o que vai dar a tua situação

o que deverias ter era um segundo array onde irias guardar a tua informação para não andares a mexer no array $linhas

ps :

- tens de ter cuidado com o explode porque a seguinte string "teste teste " resulta no segunite array:

array(0 => "teste", 1 => "teste", 2 => "");

isto devido ao espaço final

- se fosse eu, ia criar directamente o SQL

for($c = 0; $c < sizeof($linha); $c++){
 $handle = explode(" ",$linha[$c]); //quebra a linha aonde achar o |
 if (count($handler) == 3) { // validar o número de elementos lidos
$sql = "INSERT INTO persons (firstName, lastName, age) VALUES ('{$handler[0]}', '{$handler[1]}', '{$handler[2]}')";
$result = mysql_query($sql) or die(mysql_error());
 }
}

Não percebi bem...

Estas a dizer para por num array as linhas e noutro os campos das colunas?

antes estas linhas estavam assim:

  $linha[$c][0] = $handle[0];
	$linha[$c][1] = $handle[1];
	$linha[$c][2] = $handle[2];

depois alterei para o que estava no primeiro post... e depois de dizes reparei que so uma linha bastava 🙂 mas continua a nao funcionar como deve ser

Edited by ivan919
Link to comment
Share on other sites

Posso sugerir uma coisa?

Lê o ficheiro para uma variável, linha a linha.

A cada linha que fores lendo fazes o seguinte:

$nome[i] = strtok($linha, ' ');
$apelido[i] = strtok(NULL, ' ');
$idade[i] = strtok(NULL, '\n'); // Não tenho a certeza do \n, mas deve funcionar.

Assim ficas com os dados separados em variáveis e depois é só fazeres INSERT na tabela... (A formatação do texto deve ser a que colocaste no primeiro post).

Ou então podes mudar a formatação do ficheiro para:

nome=João&apelido=Silva&idade=20
nome=Zé&apelido=Ninguém&idade=27
nome=John&apelido=Doe&idade=45

E depois enquanto lês as linhas uma a uma vais fazendo:

parse_str($linha);
$nomes[i] = $nome;
$apelidos[i] = $apelido;
$idades[i] = $idade;

Espero ter ajudado e não ter dito asneira nenhuma,

Cumprimentos.

Edited by Volans
Link to comment
Share on other sites

Boas,

ja consegui chegar a este resultado:

<?php
include "init.php";
$arquivo = "./Importar/teste.txt";
$arq = fopen($arquivo,'r');
while(!feof($arq))
$linha[] = fgets($arq);
for($c = 0; $c < sizeof($linha); $c++){
$coluna = explode(" ",$linha[$c]);
$linha[$c];
for($a = 0; $a < sizeof($coluna); $a++){
$coluna[$a];
}
}
for($c = 0; $c < sizeof($linha); $c++){
$sql = "insert into persons (firstName, lastName, age) VALUES ('".$linha[$c]."', '".$linha[$c]."', '".$linha[$c]."')";
$result = mysql_query($sql) or die(mysql_error());
}
?>

Mas continua a não ser o que eu preciso :X

da-me este resultado:

ID: firstname: lastename: Age:

1298 Dan McGauhey 12 Dan McGauhey 12 0

1299 Ana Dinis 21 Ana Dinis 21 0

1300 Pedro Branco 43 Pedro Branco 43 0

Preciso que por exemplo no ID: 1298 seja:

firstname: Dan

Lastname:McGauhey

Age: 12

Vou tentando fazer experiencias ate conseguir quem puder ajudar obrigado:)

Edited by ivan919
Link to comment
Share on other sites

Bem consegui maneira de introduzir 3 registos:

<?php
include "init.php";
$arquivo = "./Importar/teste.txt";
$arq = fopen($arquivo,'r');
while(!feof($arq))
{
$linha = fgets($arq);
$coluna = explode(" ",$linha);
$fname = $coluna[0];
$lname= $coluna[1];
$age= $coluna[2];
$sql = "insert into persons (firstName, lastName, age) VALUES ('$fname', '$lname', '$age')";
$result = mysql_query($sql) or die(mysql_error());
}
?>

mas se meter um a menos no doc txt ja nao funciona.

Mas posso por varios registos desde que 3 seja o minimo... mas preciso que de para por qualquer numero de registos no txt para introduzir no mysql mesmo que seja um ficheiro com 1 registo...

Edited by ivan919
Link to comment
Share on other sites

- se fosse eu, ia criar directamente o SQL

for($c = 0; $c < sizeof($linha); $c++){
 $handle = explode(" ",$linha[$c]); //quebra a linha aonde achar o |
 if (count($handler) == 3) { // validar o número de elementos lidos
$sql = "INSERT INTO persons (firstName, lastName, age) VALUES ('{$handler[0]}', '{$handler[1]}', '{$handler[2]}')";
$result = mysql_query($sql) or die(mysql_error());
 }
}

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Boas consegui resolver o problema

Aqui esta a solução :

<?php
include "init.php";
$arquivo = "./Importar/" . $_POST["ficheiro"];
$arq = fopen($arquivo, 'r');
while(!feof($arq))
{
$linha = fgets($arq);
$coluna = explode(" ",$linha);
$fname = $coluna[0];
$lname= $coluna[1];
$age= $coluna[2];
$sql = "insert into persons (firstName, lastName, age) VALUES ('$fname', '$lname', '$age')";
$result = mysql_query($sql) or die(mysql_error());
}
?>

Mas queria melhorar uma coisa...

$arquivo = "./Importar/" . $_POST["ficheiro"];

nesta linha de código o nome do ficheiro tem que estar nessa pasta "Importar" que esta junto aos restos dos ficheiros, mas queria que desse para procurar ficheiros txt que estivessem em qualquer sitio do computador, alguém sabe como posso fazer isso? sff Obrigado

Link to comment
Share on other sites

se o valor de $_POST for "ficheiro.txt" estás a dizer que o ficheiro se encontra em "C:/ficheiro.txt" ... isso é correto ??

não claro que não, era mesmo isso que eu queria resolver, Pois antes tinha o "./Importar..." mas ficava restrito a so essa pasta agora queria que fosse possivel ir a qualquer sitio buscar o ficheiro

Link to comment
Share on other sites

ok ... eu estava a ver se percebias o que é uma arvore de diretórios, mas parece que vai ser complicado

em vez disso usa a funcionalidade do php para te dar diretamente o caminho de um ficheiro

(eu separei para ver se percebes cada elemento)

// isto da-te o caminho até ao script que está a ser executado
// exemplo : se o ficheiro for "c:/xampp/htdocs/script.php", isto resulta em "c:/xampp/htdocs"
$path = dirname(__FILE__);

// como o passo anterior não devolve um caminho com o "/" final, é necessário adicionar
// para que a próxima concatenação não de um resultado errado
$path.= "/";

// agora que já tens o caminho para o script, e supondo que o ficheiro se encontra no mesmo directório que o script
// é só adicionar/concatenar o nome do ficheiro que vem do $_POST 
$path.= $_POST['ficheiro'];
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

ok ... eu estava a ver se percebias o que é uma arvore de diretórios, mas parece que vai ser complicado

em vez disso usa a funcionalidade do php para te dar diretamente o caminho de um ficheiro

(eu separei para ver se percebes cada elemento)

// isto da-te o caminho até ao script que está a ser executado
// exemplo : se o ficheiro for "c:/xampp/htdocs/script.php", isto resulta em "c:/xampp/htdocs"
$path = dirname(__FILE__);

// como o passo anterior não devolve um caminho com o "/" final, é necessário adicionar
// para que a próxima concatenação não de um resultado errado
$path.= "/";

// agora que já tens o caminho para o script, e supondo que o ficheiro se encontra no mesmo directório que o script
// é só adicionar/concatenar o nome do ficheiro que vem do $_POST
$path.= $_POST['ficheiro'];

Pelo que vi na net onde dizes:

$path=dirname(__FILE__)

o "__FILE__" é o nome do ficheiro e é necessário mete-lo lá.

Fiz assim mas mesmo assim não resultou:


...
$ficheiro= $_POST["ficheiro"];
$arquivo = dirname("$ficheiro");
$arquivo .="/";
$arquivo .= $ficheiro;
$arq = fopen($arquivo, 'r');
...
Edited by ivan919
Link to comment
Share on other sites

deixa de ver na net ... o código que te apresentei é o código final !!!

eu afinal comentei aquilo tudo para que ??

eu exprimentei como disseste e nao deu mas secalhar copiei mal vou tentar de novo

o site que eu vi foi o do PHP...

voltei a tentar e o codigo ficou assim:

$path = dirname(__FILE__);
$path.= "/";
$path.= $_POST['ficheiro'];
$arq = fopen($path, 'r');

como tinhas dito...

mas continua a nao funcionar :/

Bem tive a ver... e nao sei se o codigo esta totalmente bem...

Aqui vai o meu raciocínio:

o dirname(__FILE__) devolve o directorio onde esta o ficheiro em que é utilizado...

ou seja quando vai buscar o directório do ficheiro que o utiliza,que é o que eu nao quero, pois preciso do directorio do ficheiro que quero importar.

se o ficheiro com o nome file.txt esta no ambiente de trabalho o directorio que o dirname(__FILE__) encontra é o C:\xampp\htdocs\www e ainda juntamos o "/" e o nome do ficheiro, o mesmo não é encontrado lá pois esta no ambiente de trabalho

Estou certo?

Edited by ivan919
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.