Foros del Web » Programando para Internet » PHP »

bucle foreach lines

Estas en el tema de bucle foreach lines en el foro de PHP en Foros del Web. Hola amigos, tanto tiempo que no andaba por acá. Bueno, el tema es el siguiente, estoy tratando de enviar datos de un archivo a la ...
  #1 (permalink)  
Antiguo 06/09/2010, 13:36
Avatar de principiantedelphp  
Fecha de Ingreso: febrero-2010
Mensajes: 160
Antigüedad: 14 años, 2 meses
Puntos: 1
bucle foreach lines

Hola amigos, tanto tiempo que no andaba por acá. Bueno, el tema es el siguiente, estoy tratando de enviar datos de un archivo a la base de datos, usando lógicamente un bucle foreach.
El problema es grave, porque digamos que la información se repite de la siguiente manera:

Cita:
[Event "Dortmund (open)"]
[Site "?"]
[Date "1992.??.??"]
[Round "?"]
[White "Kramnik, Vladimir"]
[Black "Levin, F."]
[Result "1-0"]
[ECO "A01"]
[WhiteElo "2590"]
[BlackElo "2445"]
[PlyCount "63"]
[EventDate "1992.??.??"]
[Source "ChessBase"]
[SourceDate "1992.02.01"]

1. b3 d5 2. Bb2 Nf6 3. e3 g6 4. c4 dxc4 5. Bxc4 Bg7 6. Nf3 c5 7. a3 O-O 8. b4
Nbd7 9. O-O b6 10. bxc5 bxc5 11. Be2 Qb6 12. Bc3 Ba6 13. a4 Bxe2 14. Qxe2 Qe6
15. Na3 Nb6 16. Qa6 Qd7 17. Qb5 Nbd5 18. Be5 Qe6 19. Rfc1 Nd7 20. Bxg7 Kxg7 21.
Qc4 Rfc8 22. Rab1 N7b6 23. Qh4 f6 24. a5 Nd7 25. Qc4 Rab8 26. h3 Nc7 27. Qa4
Na6 28. Nb5 Qc6 29. Qc4 Ra8 30. Nfd4 Ne5 31. Nxc6 Nxc4 32. Nbxa7 1-0

[Event "Wien"]
[Site "?"]
[Date "1996.??.??"]
[Round "?"]
[White "Kortchnoi, V."]
[Black "Kramnik, Vladimir"]
[Result "0-1"]
[ECO "A06"]
[WhiteElo "2635"]
[BlackElo "2765"]
[PlyCount "84"]
[EventDate "1996.??.??"]
[Source "ChessBase"]
[SourceDate "1996.06.01"]

1. Nf3 d5 2. b3 c5 3. e3 Nf6 4. Bb2 e6 5. c4 dxc4 6. bxc4 Nc6 7. Be2 Be7 8. O-O
O-O 9. Qc2 b6 10. a3 Bb7 11. Ng5 h6 12. Nh3 Rc8 13. d3 Rc7 14. f4 Ne8 15. f5
Bg5 16. Nxg5 Qxg5 17. Rf3 Ne7 18. e4 exf5 19. Rg3 Qh4 20. Nc3 fxe4 21. dxe4 Ng6
22. Nd5 Bxd5 23. exd5 Nd6 24. Rf1 Re8 25. Bd3 Ne5 26. a4 Rce7 27. Rh3 Qg5 28.
Rg3 Qh4 29. Rh3 Qg4 30. Rg3 Qd7 31. Qd2 Ng6 32. Qc3 Ne5 33. Qc1 f6 34. Bxe5
fxe5 35. Qxh6 e4 36. Qh5 Re5 37. Qg6 exd3 38. Rh3 Rf5 39. Qh7+ Kf8 40. Rxf5+
Nxf5 41. Rf3 Re5 42. g4 d2 0-1

Hice esto, pero, no resulto (me imprime 16000 filas vacías!)

Cita:
$lines = file('kramnik.pgn');
foreach ($lines as $line_num => $line) {
mt_srand (time());
$players = $datos[5];
$result=$datos[7];
$whiteelo=$datos[9];
$blackelo=$datos[10];
$year=$datos[3];
$event=$datos[1];
$eco=$datos[8];
$q = "INSERT INTO chesstemporal (players, result, whiteelo, blackelo, year, event,eco)

values ('$players', '$result', '$whiteelo', '$blackelo', '$year', '$event', '$eco')";
mysql_query($q, $link);
}
mysql_close($link);
?>
Creo que el problema está en que el archivo contiene datos separados por un "enter" y luego de un tiempo (algunas filas) vuelve a repetirse y no se como colocar esto en una única fila. Los campos que necesito son 1,3,5,7,8,9 y 10, o sea 7 datos de las etiquetas).
Cualquier ayuda, bienvenida y gracias de antemano
  #2 (permalink)  
Antiguo 06/09/2010, 14:00
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: bucle foreach lines

No entiendo en tu codigo para que hacés el foreach si luego no utilizás los datos: $line_num y $line

Además, esa ejecución va a darse por cada renglón, y no por cada bloque. Me equivoco?

Respecto a saltos de linea, fijate en el manual:
http://php.net/manual/es/function.file.php

Cita:
Cada línea en la matriz resultante incuirá el final de línea, a menos que se use FILE_IGNORE_NEW_LINES, por lo que aún necesita utilizar rtrim() si no quiere que el final de línea esté presente.
  #3 (permalink)  
Antiguo 06/09/2010, 14:15
Avatar de principiantedelphp  
Fecha de Ingreso: febrero-2010
Mensajes: 160
Antigüedad: 14 años, 2 meses
Puntos: 1
Gracias Mayid. Mira, yo tenía un archivo de texto, por ejemplo, tenía 100 bloques. Los bloques estaban separados por retornos de carro (/t), o sea, cada "enter", tenía un bloque. Entonces, podía leer cada parte del bloque y ponerlo en una columna diferente. Cuando venía un /t, simplemente, empezaba a llenar la segunda fila y listo.
($datos = explode("\t", $line);)
Fue la linea que me comí recien, perdón, ya lo corregi.
El tema, es que ahora cambio todo: Las columnas del archivo están separadas por /t (no por tabulaciones) y cuando empieza a llenar la segunda fila, no se como hacerlo realmente. Disculpa mis errores en el código

En síntesis: 1) Me imprime todo el archivo, en la columna 1 (de players). ¿Por qué? , Calculo que porque

[Event "Dortmund (open)"] Me lo imprime en la primer columna (players) primer fila
[Site "?"]: Me lo imprimer en la primer columna (players) segunda fila
Y así sucesivamente. O sea, me imprime todas las filas de este archivo en la columna "players", fila por fila (y algunas filas están vacías)

Alguien me ayuda por favor?

Última edición por GatorV; 07/09/2010 a las 07:56
  #4 (permalink)  
Antiguo 06/09/2010, 18:23
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: bucle foreach lines

Cita:
Iniciado por principiantedelphp Ver Mensaje
Alguien me ayuda por favor?
¿cual es el problema actual?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 06/09/2010, 18:37
Avatar de principiantedelphp  
Fecha de Ingreso: febrero-2010
Mensajes: 160
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: bucle foreach lines

pateketrueke, gracias. Es simple de explicar:
Tengo 14 filas separadas por un retorno de carro cada fila. Luego vienen 2 retornos de carro y luego esto:
Cita:
1. Nf3 d5 2. b3 c5 3. e3 Nf6 4. Bb2 e6 5. c4 dxc4 6. bxc4 Nc6 7. Be2 Be7 8. O-O
O-O 9. Qc2 b6 10. a3 Bb7 11. Ng5 h6 12. Nh3 Rc8 13. d3 Rc7 14. f4 Ne8 15. f5
Bg5 16. Nxg5 Qxg5 17. Rf3 Ne7 18. e4 exf5 19. Rg3 Qh4 20. Nc3 fxe4 21. dxe4 Ng6
22. Nd5 Bxd5 23. exd5 Nd6 24. Rf1 Re8 25. Bd3 Ne5 26. a4 Rce7 27. Rh3 Qg5 28.
Rg3 Qh4 29. Rh3 Qg4 30. Rg3 Qd7 31. Qd2 Ng6 32. Qc3 Ne5 33. Qc1 f6 34. Bxe5
fxe5 35. Qxh6 e4 36. Qh5 Re5 37. Qg6 exd3 38. Rh3 Rf5 39. Qh7+ Kf8 40. Rxf5+
Nxf5 41. Rf3 Re5 42. g4 d2 0-1
Luego 2 retornos de carro más y comienza nuevamente otro "bloque".
Lo que no se como hacer (hace horas que me rompo la cabeza) es como tomar estos 15 elementos para que los ponga en 15 columnas y luego, al elemento 16, sería el 1 del segundo bloque, para que llene la segunda fila. No se como hacer el retorno de carro, porque /t es tabulacion y aca estan separados por un enter.
  #6 (permalink)  
Antiguo 06/09/2010, 18:45
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: bucle foreach lines

el retorno de carro es \r, una nueva linea es \n
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 06/09/2010, 19:03
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 14 años, 9 meses
Puntos: 150
Respuesta: bucle foreach lines

Tendras que ingeniartelas para hacer que en un bucle de lectura linea-por-linea vayas haciendo avanzar una variable $v y vayas actuando respecto a ella.

Es decir, la variable $v empieza con el valor 1 al leer la primera linea, haces lo que sea y aumentas $v++.

Asi vas haciendo lo que corresponda dependiendo del valor de $v, cuando $v valga 16 lo vuelves a poner a 1 para que coincida con el inicio de otro de esos "bloques".

Espero que aunque no te ponga código hayas captado la idea...
  #8 (permalink)  
Antiguo 06/09/2010, 19:29
Avatar de principiantedelphp  
Fecha de Ingreso: febrero-2010
Mensajes: 160
Antigüedad: 14 años, 2 meses
Puntos: 1
Mas o menos. Intenté esto:

Cita:
$lines = file('kramnik.pgn');
foreach ($lines as $line_num => $line) {
$event = $datos[0];
$site=$datos[1];
$date=$datos[2];
$round=$datos[3];
$whiteplayer=$datos[4];
$blackplayer=$datos[5];
$result=$datos[6];
$eco=$datos[7];
$whiteelo=$datos[8];
$blackelo=$datos[9];
$plycount=$datos[10];
$eventdate=$datos[11];
$source=$datos[12];
$sourcedate=$datos[13];
$empty1=$datos[14];
$game=$datos[15];
$empty2=$datos[16];

$q = "INSERT INTO chesstemporal (event, site, date, round, whiteplayer, blackplayer, result, eco, whiteelo, blackelo, plycount, eventdate, source, sourcedate, empty1, game, empty2) values ('$event', '$site', '$date', '$round', '$whiteplayer', '$blackplayer', '$result', '$eco', '$whiteelo', '$blackelo', '$plycount', '$eventdate', '$source', '$sourcedate', '$empty1', '$game', '$empty2')";
$datos = explode("\r", $line);
mysql_query($q, $link);
}
mysql_close($link);

Que imprime toda la información del archivo, pero me imprime todo solamente en la primer columna (event) y nunca toma las demas columnas. Ahi está mi problema, no se como pasar las filas del archivo a las columnas de la base de datos MySQL.

Como se ve, inventé 2 columnas "empty1" y "empty2" que son para que siga leyendo el bloque (y no se defase). Pero me imprime la informacion en 16 mil filas, pero solo en la primer columna, o sea:

Cita:
2 [Event "Dortmund (open)"]

3 [Site "?"]

4 [Date "1992.??.??"]

5 [Round "?"]

6 [White "Kramnik, Vladimir"]

7 [Black "Levin, F."]
1, 2, 3, es un id (autoincrement)

Última edición por GatorV; 07/09/2010 a las 07:57
  #9 (permalink)  
Antiguo 06/09/2010, 19:35
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: bucle foreach lines

creo que ya entiendo tu problema...

la función file() devuelve un arreglo, separando las filas por salto de linea... de modo que ya no necesitas usar explode()

ese es el primero paso a seguir, iterar solamente el resultado de file() e imprimirlo para que analices de nuevo la estructura lógica...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 06/09/2010, 19:41
Avatar de principiantedelphp  
Fecha de Ingreso: febrero-2010
Mensajes: 160
Antigüedad: 14 años, 2 meses
Puntos: 1
No se, porque eliminé la fila (le puse */ /* como comentario) y no imprimió nada, solo el id autoincrement

Perdón, eliminé la fila:

Cita:
$datos = explode("\r", $line);
y no imprimió nada, solo el id autoincrement (1, 2,...n, etc)

Lo que no entiendo, principalmente, es porque imprime solo en la segunda columna de la tabla (la primera es la de "id") y deja vacía las demas. ¿Me ayudan por favor? Gracias
Y para no molestar más, ¿Es posible cambiar los valores de /r por /t en todo el archivo, para diferenciar bien los bloques?

Última edición por GatorV; 07/09/2010 a las 07:57
  #11 (permalink)  
Antiguo 06/09/2010, 20:31
Avatar de silvanha  
Fecha de Ingreso: marzo-2006
Ubicación: En mi mundo de sueños
Mensajes: 653
Antigüedad: 18 años, 1 mes
Puntos: 65
Respuesta: bucle foreach lines

hace tiempo que no trabajo con archivos, me supongo que eso si te lo esta sacando bien xD

jugue un poco con tu código, y es que el archivo automaticamente se abre por líneas, es decir no tienes que separar con el explode..

prueba esto.. para que veas..
Código PHP:
Ver original
  1. $lines = file('kramnik.pgn');
  2. $datos = array();
  3. foreach ($lines as $line_num) {
  4.     echo "<br>line:".$line_num;
  5.     $datos[] = $line_num;
  6. }
  7.  
  8. foreach ($datos as $line_num){
  9.     echo "<br>cosa:".$line_num;
  10. }

al final te manda a imprimir lo que tiene el arreglo conforme se saca.. si te das cuenta al final se trata de dividir ahora si el arreglo, y acomodarlo para que lo guardes en al BD, y además llevar un contador para el segundo parrafo, porque te lo saca en líneas..

espero te sirva ;)
__________________
●•· No hay nada imposible..
●•· Vico-X.. ;)
  #12 (permalink)  
Antiguo 07/09/2010, 07:51
Avatar de principiantedelphp  
Fecha de Ingreso: febrero-2010
Mensajes: 160
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: bucle foreach lines

Amiga Silvanha: Gracias por salir de tu mundo de sueños y entrar a mi infierno...
En la base de datos MySQL, mostró: (columna 1 siempre es id autoincrement)
Fila 1 Columna 2 (event): Event "Gausdal"
Fila 2 Columna 2 (event): Event "Gausdal" // Columna 3: Site ""
Fila 3 Columna 2 (event): Event "Gausdal" // Columna 3: Site "" // Columna 4:Date: 1992
Fila 4 Columna 2 (event): Event "Gausdal" // Columna 3: Site "" // Columna 4:Date: 1992 // Round: ?
Y así sucesivamente. Es decir, que a medida que pasaba de una fila a la otra, se agregaba un dato más

En pantalla:

Cita:
line:[Event "Gausdal"]
cosa:[Event "Gausdal"]
line:[Site "?"]
cosa:
cosa:[Site "?"]
line:[Date "1992.??.??"]
cosa:
cosa:[Date "1992.??.??"]
line:[Round "?"]
cosa:
cosa:[Round "?"]
line:[White "Kramnik, Vladimir"]
cosa:
cosa:[White "Kramnik, Vladimir"]
line:[Black "Lerner, K."]
Veré que puedo hacer, parece un problema complejo

PD: Te pongo el código:

Cita:
$lines = file('kramnik.pgn');
foreach ($lines as $line_num) {
{echo "<br>line:".$line_num;
$datos[] = $line_num;}

foreach ($datos as $line_num)
{echo "<br>cosa:".$line_num;}
$event = $datos[0];
$site=$datos[1];
$date=$datos[2];
$round=$datos[3];
$whiteplayer=$datos[4];
$blackplayer=$datos[5];
$result=$datos[6];
$eco=$datos[7];
$whiteelo=$datos[8];
$blackelo=$datos[9];
$plycount=$datos[10];
$eventdate=$datos[11];
$source=$datos[12];
$sourcedate=$datos[13];
$empty1=$datos[14];
$game=$datos[15];
$empty2=$datos[16];

$q = "INSERT INTO chesstemporal (event, site, date, round, whiteplayer, blackplayer, result, eco, whiteelo, blackelo, plycount, eventdate, source, sourcedate, empty1, game, empty2) values ('$event', '$site', '$date', '$round', '$whiteplayer', '$blackplayer', '$result', '$eco', '$whiteelo', '$blackelo', '$plycount', '$eventdate', '$source', '$sourcedate', '$empty1', '$game', '$empty2')";
mysql_query($q, $link);
}
mysql_close($link);

Última edición por principiantedelphp; 07/09/2010 a las 08:04
  #13 (permalink)  
Antiguo 07/09/2010, 08:22
Avatar de principiantedelphp  
Fecha de Ingreso: febrero-2010
Mensajes: 160
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: bucle foreach lines

Ahi lo arreglé un poco, saque un par de llaves, pone todos los datos del primer bloque en la primer fila y las demás filas no las llena.
Pregunto: Como puedo hacer en este caso:

Cita:
1. b3 d5 2. Bb2 Nf6 3. e3 g6 4. c4 dxc4 5. Bxc4 Bg7 6. Nf3 c5 7. a3 O-O 8. b4
Nbd7 9. O-O b6 10. bxc5 bxc5 11. Be2 Qb6 12. Bc3 Ba6 13. a4 Bxe2 14. Qxe2 Qe6
15. Na3 Nb6 16. Qa6 Qd7 17. Qb5 Nbd5 18. Be5 Qe6 19. Rfc1 Nd7 20. Bxg7 Kxg7 21.
Qc4 Rfc8 22. Rab1 N7b6 23. Qh4 f6 24. a5 Nd7 25. Qc4 Rab8 26. h3 Nc7 27. Qa4
Na6 28. Nb5 Qc6 29. Qc4 Ra8 30. Nfd4 Ne5 31. Nxc6 Nxc4 32. Nbxa7 1-0
Aqui son 5 filas, pero podrían ser entre 1 y 30. Mi pregunta: como hago para que todas estas filas se coloquen en un único campo de la base de datos? O sea, sería como "unir las filas"
  #14 (permalink)  
Antiguo 07/09/2010, 11:16
Avatar de silvanha  
Fecha de Ingreso: marzo-2006
Ubicación: En mi mundo de sueños
Mensajes: 653
Antigüedad: 18 años, 1 mes
Puntos: 65
Respuesta: bucle foreach lines

creo que ya casi tienes lo que necesitas, o ando perdida?? y no es para nada complejo, solo que necesitas ubicarte bien como va la cosa.. :)

jejejeje..

en el caso del párrafo
Cita:
y además llevar un contador para el segundo parrafo, porque te lo saca en líneas..
o bien.. sería =P

Código PHP:
Ver original
  1. $parrafo = $datos[16]."\n".$datos[17]."\n".$datos[19]."\n".$datos[19]."\n".$datos[20];

el punto concatena valores, esta es la forma fea xDDD y poco ortodoxa, muchos aquí harían algo más bonito jajajajaja

la otra es que hagas un mini ciclo

Código PHP:
Ver original
  1. for($i=16;$i<20;$i++)
  2.   $cadena .= $datos[$i]."\n";

que ni sentido le veo porque solo son 5 líneas xDDDD el "\n" es para que te guarde los saltos de línea..

suerte ^^

PD: De mi mundo de sueños, no salgo ni a palos xDDDDDDDD
__________________
●•· No hay nada imposible..
●•· Vico-X.. ;)
  #15 (permalink)  
Antiguo 07/09/2010, 12:19
Avatar de principiantedelphp  
Fecha de Ingreso: febrero-2010
Mensajes: 160
Antigüedad: 14 años, 2 meses
Puntos: 1
Silvanha: Casi lo tengo: Fijate en la pregunta que hare ahora y en el código

Tengo un problema de iteración con php. Leo de un archivo y en la base de datos me imprime correctamente en todas las filas, excepto en la penúltima, en la cual me termina imprimiendo todo el resto de los datos.

Cita:
$lines = file('kramnik.pgn');
foreach ($lines as $line_num)
{echo "".$line_num;
$datos[] = $line_num;}

foreach ($datos as $line_num)
/*{echo "<br>cosa:".$line_num;} */
$event = $datos[0];
$site=$datos[1];
$date=$datos[2];
$round=$datos[3];
$whiteplayer=$datos[4];
$blackplayer=$datos[5];
$result=$datos[6];
$eco=$datos[7];
$whiteelo=$datos[8];
$blackelo=$datos[9];
$plycount=$datos[10];
$eventdate=$datos[11];
$source=$datos[12];
$sourcedate=$datos[13];
$empty1=$datos[14];
For ($contador=15; $contador<=1000 ; $contador++)
{
$game=$game.$datos[$contador];
if (empty($datos[$contador])) {$ultimo=$contador; $contador=16; echo $contador;
break;}
}
$empty2=$datos[$ultimo];

$q = "INSERT INTO chesstemporal (event, site, date, round, whiteplayer, blackplayer, result, eco, whiteelo, blackelo, plycount, eventdate, source, sourcedate, empty1, game, empty2) values ('$event', '$site', '$date', '$round', '$whiteplayer', '$blackplayer', '$result', '$eco', '$whiteelo', '$blackelo', '$plycount', '$eventdate', '$source', '$sourcedate', '$empty1', '$game', '$empty2')";
mysql_query($q, $link);
mysql_close($link);
El archivo del cual lee es el siguiente:

Cita:
[Event "Gausdal"]
[Site "?"]
[Date "1992.??.??"]
[Round "?"]
[White "Kramnik, Vladimir"]
[Black "Lerner, K."]
[Result "1-0"]
[ECO "A01"]
[WhiteElo "2590"]
[BlackElo "2515"]
[PlyCount "79"]
[EventDate "1992.??.??"]
[Source "ChessBase"]
[SourceDate "1991.10.01"]

1. b3 e5 2. Bb2 d6 3. g3 Nf6 4. Bg2 Be7 5. e3 Nc6 6. d3 O-O 7. Nf3 h6 8. c4 Be6
9. O-O Qd7 10. d4 exd4 11. exd4 Bf5 12. a3 Rae8 13. d5 Nb8 14. Nc3 Bd8 15. Nd4
Bh3 16. Qd3 Re5 17. Nce2 Bxg2 18. Kxg2 Rfe8 19. Nf4 Re4 20. Rad1 Na6 21. b4 Nb8
22. Nb3 g5 23. Nd2 gxf4 24. Bxf6 Re2 25. Bc3 Qg4 26. Qd4 Kh7 27. Rde1 c5 28.
Qd3+ f5 29. Rxe2 Rxe2 30. bxc5 dxc5 31. Nf3 Re4 32. d6 Nd7 33. Qd5 Qg6 34. Qxb7
Qxd6 35. Be5 Qd3 36. Bxf4 Bf6 37. Qc6 Re7 38. Rc1 Qe4 39. Qd6 Qb7 40. Rd1 1-0

[Event "Dortmund (open)"]
[Site "?"]
[Date "1992.??.??"]
[Round "?"]
[White "Kramnik, Vladimir"]
[Black "Levin, F."]
[Result "1-0"]
[ECO "A01"]
[WhiteElo "2590"]
[BlackElo "2445"]
[PlyCount "63"]
[EventDate "1992.??.??"]
[Source "ChessBase"]
[SourceDate "1992.02.01"]

1. b3 d5 2. Bb2 Nf6 3. e3 g6 4. c4 dxc4 5. Bxc4 Bg7 6. Nf3 c5 7. a3 O-O 8. b4
Nbd7 9. O-O b6 10. bxc5 bxc5 11. Be2 Qb6 12. Bc3 Ba6 13. a4 Bxe2 14. Qxe2 Qe6
15. Na3 Nb6 16. Qa6 Qd7 17. Qb5 Nbd5 18. Be5 Qe6 19. Rfc1 Nd7 20. Bxg7 Kxg7 21.
Qc4 Rfc8 22. Rab1 N7b6 23. Qh4 f6 24. a5 Nd7 25. Qc4 Rab8 26. h3 Nc7 27. Qa4
Na6 28. Nb5 Qc6 29. Qc4 Ra8 30. Nfd4 Ne5 31. Nxc6 Nxc4 32. Nbxa7 1-0

[Event "Wien"]
[Site "?"]
[Date "1996.??.??"]
[Round "?"]
[White "Kortchnoi, V."]
[Black "Kramnik, Vladimir"]
[Result "0-1"]
[ECO "A06"]
[WhiteElo "2635"]
[BlackElo "2765"]
[PlyCount "84"]
[EventDate "1996.??.??"]
[Source "ChessBase"]
[SourceDate "1996.06.01"]

1. Nf3 d5 2. b3 c5 3. e3 Nf6 4. Bb2 e6 5. c4 dxc4 6. bxc4 Nc6 7. Be2 Be7 8. O-O
O-O 9. Qc2 b6 10. a3 Bb7 11. Ng5 h6 12. Nh3 Rc8 13. d3 Rc7 14. f4 Ne8 15. f5
Bg5 16. Nxg5 Qxg5 17. Rf3 Ne7 18. e4 exf5 19. Rg3 Qh4 20. Nc3 fxe4 21. dxe4 Ng6
22. Nd5 Bxd5 23. exd5 Nd6 24. Rf1 Re8 25. Bd3 Ne5 26. a4 Rce7 27. Rh3 Qg5 28.
Rg3 Qh4 29. Rh3 Qg4 30. Rg3 Qd7 31. Qd2 Ng6 32. Qc3 Ne5 33. Qc1 f6 34. Bxe5
fxe5 35. Qxh6 e4 36. Qh5 Re5 37. Qg6 exd3 38. Rh3 Rf5 39. Qh7+ Kf8 40. Rxf5+
Nxf5 41. Rf3 Re5 42. g4 d2 0-1

[Event "Moskva (open)"]
[Site "?"]
[Date "1992.??.??"]
[Round "?"]
[White "Sturua, Z."]
[Black "Kramnik, Vladimir"]
[Result "0-1"]
[ECO "A07"]
[WhiteElo "2545"]
[BlackElo "2625"]
[PlyCount "72"]
[EventDate "1992.??.??"]
[Source "ChessBase"]
[SourceDate "1992.10.01"]

1. Nf3 d5 2. g3 c6 3. Bg2 Bg4 4. O-O Nd7 5. d3 Ngf6 6. Nbd2 e5 7. e4 Bd6 8. h3
Bh5 9. b3 O-O 10. Bb2 Re8 11. Re1 a5 12. a3 b5 13. Nf1 dxe4 14. dxe4 Nc5 15.
N1d2 Qc7 16. Qc1 Nfd7 17. Nh4 Ne6 18. Ndf3 f6 19. Nf5 Bf8 20. Re3 Bf7 21. Qe1
g6 22. N5h4 c5 23. Bf1 Nd4 24. Qd1 Rad8 25. Nxd4 cxd4 26. Re1 Qc6 27. Nf3 Nc5
28. Bd3 Nxd3 29. Qxd3 a4 30. Nd2 Bh6 31. Kh2 Rc8 32. Rac1 Bc4 33. bxc4 bxc4 34.
Nxc4 Bxc1 35. Nxe5 Qxc2 36. Qf3 Bxb2 0-1
etc.

En MySQL, cree 17 columnas, a saber: 14 para las 14 primeras filas, la columna 15 es una fila vacia (empty1), la columna 16 es
Cita:
1. Nf3 d5 2. g3 c6 3. Bg2 Bg4 4. O-O Nd7 5. d3 Ngf6 6. Nbd2 e5 7. e4 Bd6 8. h3
Bh5 9. b3 O-O 10. Bb2 Re8 11. Re1 a5 12. a3 b5 13. Nf1 dxe4 14. dxe4 Nc5 15.
N1d2 Qc7 16. Qc1 Nfd7 17. Nh4 Ne6 18. Ndf3 f6 19. Nf5 Bf8 20. Re3 Bf7 21. Qe1
g6 22. N5h4 c5 23. Bf1 Nd4 24. Qd1 Rad8 25. Nxd4 cxd4 26. Re1 Qc6 27. Nf3 Nc5
28. Bd3 Nxd3 29. Qxd3 a4 30. Nd2 Bh6 31. Kh2 Rc8 32. Rac1 Bc4 33. bxc4 bxc4 34.
Nxc4 Bxc1 35. Nxe5 Qxc2 36. Qf3 Bxb2 0-1
En el cual uni las filas con un bucle y la columna 17 es la fila vacia final (empty2) , antes del siguiente bloque. Esta ultima es la que quiero detectar (con la etiqueta "empty") y me coloca todos los bloques en la penultima columna (la 16) mientra que la 17 queda vacía.

Hola a todos, explicaré mi problema en la forma más sencilla posible:
1) Tengo un archivo de texto
2) La información está en filas, pero en forma de bloques

Fila 1 ------- Aca empieza el bloque 1
Fila 2
Fila 3
Fila = " "
Fila 4
Fila 5
Fila 6
Fila = " " .........Aca termina el bloque 1
Fila 1 -------Aca empieza el bloque 2
Fila 2

3) Las filas 1, 2 y 3 se mantienen siempre. O sea que están siempre. Las filas = "" también están siempre. Las filas 4, 5 y 6 varían entre los bloques (podría ser que esté la 4 solamente, y en otro bloque estar 4, 5, 6, 7, 8, 9 y 10). O sea, en un bloque podría haber 3 filas y en otro 7 filas, etc.
4) Siempre al final del bloque hay una línea vacía.

Lo que quiero es poner la información de cada bloque en una fila de una tabla con 17 campos en MySQL. Las filas 4, 5, 6,etc, son colocadas en una unica variable. Ahi esta mi problema, ese campo (llamado $game) me mete no solo 4, 5, 6, sino todos los bloques en una sola columna.

Aca está el código (son 17 columnas, el esquema anterior es para simplificar el problema)

Cita:
$lines = file('kramnik.pgn');
foreach ($lines as $line_num)
{echo "".$line_num;
$datos[] = $line_num;}

foreach ($datos as $line_num)
/*{echo "<br>cosa:".$line_num;} */
$event = $datos[0];
$site=$datos[1];
$date=$datos[2];
$round=$datos[3];
$whiteplayer=$datos[4];
$blackplayer=$datos[5];
$result=$datos[6];
$eco=$datos[7];
$whiteelo=$datos[8];
$blackelo=$datos[9];
$plycount=$datos[10];
$eventdate=$datos[11];
$source=$datos[12];
$sourcedate=$datos[13];
$empty1=$datos[14];
For ($contador=15; $contador<=1000 ; $contador++)
{
$game=$game.$datos[$contador];
if (empty($datos[$contador])) {$ultimo=$contador; $contador=16; break;}
}
$empty2=$datos[$ultimo];

$q = "INSERT INTO chesstemporal (event, site, date, round, whiteplayer, blackplayer, result, eco, whiteelo, blackelo, plycount, eventdate, source, sourcedate, empty1, game, empty2) values ('$event', '$site', '$date', '$round', '$whiteplayer', '$blackplayer', '$result', '$eco', '$whiteelo', '$blackelo', '$plycount', '$eventdate', '$source', '$sourcedate', '$empty1', '$game', '$empty2')";
mysql_query($q, $link);
mysql_close($link);
La variable $game contiene las filas 4, 5, y 6 del primer bloque más todo el resto de la información (es decir, todos los demás bloques).
Quiero que esta información pase a la fila correspondiente: EL bloque 2 a la fila 2, el bloque 3 a la fila 3, y así sucesivamente. Cualquier consulta, estoy inmediatamente disponible. Gracias

Última edición por GatorV; 07/09/2010 a las 13:40
  #16 (permalink)  
Antiguo 07/09/2010, 13:22
 
Fecha de Ingreso: octubre-2009
Ubicación: En el ordenador
Mensajes: 504
Antigüedad: 14 años, 6 meses
Puntos: 10
Respuesta: Leer archivo de texto y ponerlo en base de datos MYSQL

Edito: Vale, la proxima vez, me miro el codigo antes de responder :(

Sigo editando:

Cosas que veo: en el segundo foreach, podrías seguir usando $lines, no se ha borrado

Podrías simplificar el for así:
Código PHP:
$game ''
For ($contador=15$contador<=1000 $contador++) 
{
$game .= $datos[$contador];
if (empty(
$datos[$contador])) {$ultimo=$contador$contador=16; break;} 

O también así:
Código PHP:
$game ''
$contador=15;
while (!empty(
$datos[$contador])){
$game .= $datos[$contador];
}
$ultimo $contador
$contador 
16 
Pero igualmente, mi pregunta es: no lo estas separando ya? (con todas esas variables)
__________________
Buscando ideas para proyectos....

Esperando a tener 18 años....

Última edición por markmb; 07/09/2010 a las 13:31
  #17 (permalink)  
Antiguo 07/09/2010, 16:17
Avatar de silvanha  
Fecha de Ingreso: marzo-2006
Ubicación: En mi mundo de sueños
Mensajes: 653
Antigüedad: 18 años, 1 mes
Puntos: 65
Respuesta: bucle foreach lines

si mark lo tiene separado, pero el solo se esta liando xDDDD

y principiante.. creo que te estas echando más rollos encima, tienes lo que necesitas en un poquito de análisis .. lo que necesites concatenar.. pues concatenalo y lo que no pues pasalo directamente
__________________
●•· No hay nada imposible..
●•· Vico-X.. ;)
  #18 (permalink)  
Antiguo 07/09/2010, 17:51
Avatar de principiantedelphp  
Fecha de Ingreso: febrero-2010
Mensajes: 160
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: bucle foreach lines

Es verdad Silvanha, como dijo Napoleón a su paje de armas, antes de la batalla: "Abotóname despacio que estoy apurado"
  #19 (permalink)  
Antiguo 07/09/2010, 20:00
Avatar de silvanha  
Fecha de Ingreso: marzo-2006
Ubicación: En mi mundo de sueños
Mensajes: 653
Antigüedad: 18 años, 1 mes
Puntos: 65
Respuesta: bucle foreach lines

levántate tomate una taza de café y luego regresas.. despeja ideas.. es cuestión de practica, y también a veces dejamos de ver las cosas que son evidentes..

no te desanimes.. suerte! =)
__________________
●•· No hay nada imposible..
●•· Vico-X.. ;)

Etiquetas: bucle, foreach
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:15.