ivan919 Posted June 27, 2012 at 04:16 PM Report Share #466001 Posted June 27, 2012 at 04:16 PM 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 More sharing options...
HappyHippyHippo Posted June 27, 2012 at 04:28 PM Report Share #466003 Posted June 27, 2012 at 04:28 PM (edited) 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 June 27, 2012 at 04:33 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
ivan919 Posted June 27, 2012 at 04:37 PM Author Report Share #466005 Posted June 27, 2012 at 04:37 PM (edited) 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 June 27, 2012 at 05:19 PM by ivan919 Link to comment Share on other sites More sharing options...
Volans Posted June 27, 2012 at 05:45 PM Report Share #466024 Posted June 27, 2012 at 05:45 PM (edited) 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 June 27, 2012 at 05:45 PM by Volans Link to comment Share on other sites More sharing options...
ivan919 Posted June 28, 2012 at 09:30 AM Author Report Share #466093 Posted June 28, 2012 at 09:30 AM (edited) 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 June 28, 2012 at 09:36 AM by ivan919 Link to comment Share on other sites More sharing options...
ivan919 Posted June 28, 2012 at 10:31 AM Author Report Share #466111 Posted June 28, 2012 at 10:31 AM (edited) 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 June 28, 2012 at 10:34 AM by ivan919 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 28, 2012 at 10:40 AM Report Share #466116 Posted June 28, 2012 at 10:40 AM - 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 Portugol Plus Link to comment Share on other sites More sharing options...
ivan919 Posted June 28, 2012 at 01:38 PM Author Report Share #466158 Posted June 28, 2012 at 01:38 PM 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 More sharing options...
HappyHippyHippo Posted June 28, 2012 at 01:58 PM Report Share #466165 Posted June 28, 2012 at 01:58 PM usas o caminho absoluto. isto em unix é indicado pelo uso do caracter "/" no windows é por "C:/" (depende do driver onde está) IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
ivan919 Posted June 28, 2012 at 02:14 PM Author Report Share #466174 Posted June 28, 2012 at 02:14 PM usas o caminho absoluto. isto em unix é indicado pelo uso do caracter "/" no windows é por "C:/" (depende do driver onde está) alterei para: $arquivo = "C:/" . $_POST["ficheiro"]; mas não resolveu :X estou a fazer bem? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 28, 2012 at 02:17 PM Report Share #466177 Posted June 28, 2012 at 02:17 PM se o valor de $_POST for "ficheiro.txt" estás a dizer que o ficheiro se encontra em "C:/ficheiro.txt" ... isso é correto ?? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
ivan919 Posted June 28, 2012 at 02:22 PM Author Report Share #466179 Posted June 28, 2012 at 02:22 PM 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 More sharing options...
HappyHippyHippo Posted June 28, 2012 at 02:31 PM Report Share #466183 Posted June 28, 2012 at 02:31 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
ivan919 Posted June 28, 2012 at 02:51 PM Author Report Share #466192 Posted June 28, 2012 at 02:51 PM (edited) 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 June 28, 2012 at 03:00 PM by ivan919 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 28, 2012 at 03:15 PM Report Share #466200 Posted June 28, 2012 at 03:15 PM (edited) deixa de ver na net ... o código que te apresentei é o código final !!! eu afinal comentei aquilo tudo para que ?? Edited June 28, 2012 at 03:16 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
ivan919 Posted June 28, 2012 at 03:22 PM Author Report Share #466203 Posted June 28, 2012 at 03:22 PM (edited) 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 June 28, 2012 at 04:49 PM by ivan919 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now