Foros del Web » Programando para Internet » PHP »

cortar cadenas php

Estas en el tema de cortar cadenas php en el foro de PHP en Foros del Web. hola que tal necesito ayuda con un algoritmo que pueda resolver el siguiente problema: primero tenemos una cadena que es un archivo separado por comas: ...
  #1 (permalink)  
Antiguo 27/08/2010, 10:36
 
Fecha de Ingreso: mayo-2009
Mensajes: 53
Antigüedad: 14 años, 9 meses
Puntos: 0
cortar cadenas php

hola que tal necesito ayuda con un algoritmo que pueda resolver el siguiente problema:

primero tenemos una cadena que es un archivo separado por comas:

Cita:
001,"Carros, Inc. - obo Maersk Line, Inc.",5129706,5129706
002,"Empresa 2",51444444,7374784
etc......
la cadena anterior la tengo que cortar en pedazos para insertar cada campo en una base de datos, Pero si se dan cuenta:,

Cita:
1.- dentro de la cadena "Carros, Inc. - Obo Maersk Line, Inc." hay comas, eso hace que se me desordene todo al querer cortar la cadena original en comas con algo como esto:
Código PHP:
$file fopen ($ruta"r");//abro el archivo
$separador ",";//declaro mediante que caracter se tiene que separar 
$delimitador "/n";//declaro el limitador

// recorro los datos
                          
while(($data=fgetcsv($file,2048,$separador,$delimitador))!==false){

    
/*formo las cadena para hacer el insert
        ejemplo:
        
        (001,"Carros, Inc. - obo Maersk Line, Inc.",5129706,5129706)
       para despues hacer esto:
       $query = "REPLACE INTO  cat_clientesR(no_centro,empresa,no_cliente,referencia_sistema) VALUES ".$vals."";

       mysql_query($query,$conexion);
    */
    
$vals.="(";
    foreach(
$data as $row){

          
$vals.=$row;
          
$vals.=",";
   }

   
$vals substr($vals,0,-1);
   
$vals.="),";

Cita:
El resultado de el codigo anterior para la primer fila seria esto:
primer campo --->582,
segundo campo-->"Tangoe,
tercer campo--> Inc. - obo Maersk Line,
cuarto campo-->Inc.",
etc....5129706,
etc....5129706,

obiamente el resultado esta mal y deberia de quedar asi:
primer campo --->582,
segundo campo-->"Tangoe,Inc. - obo Maersk Line, Inc.",
tercer campo--> 5129706,
cuarto campo-->5129706,
etc....
alguien puede ayudarme a hacer eso? o es imposible?

de antemano gracias y espero sus respuestas.
  #2 (permalink)  
Antiguo 27/08/2010, 10:42
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 5 meses
Puntos: 11
Respuesta: cortar cadenas php

Yo creo que necesitas un separador , sería la coma, y un delimitador de campos, serían las comillas.
  #3 (permalink)  
Antiguo 27/08/2010, 10:50
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: cortar cadenas php

el salto de linea es \n y no /n
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 27/08/2010, 10:52
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 10 meses
Puntos: 60
Respuesta: cortar cadenas php

Creo que necesitas OTRO separador como ;
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #5 (permalink)  
Antiguo 27/08/2010, 11:02
 
Fecha de Ingreso: mayo-2009
Mensajes: 53
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: cortar cadenas php

si pero es que es un condenado archivo que me manda desde muy alto XD, je es que ese archivo me lo mandan de una factura y lo tengo que meter a una tabla de mi base de datos y no creo que ello quieran modificar su forma de generar el archivo. un saludo
  #6 (permalink)  
Antiguo 27/08/2010, 11:06
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 5 meses
Puntos: 334
Respuesta: cortar cadenas php

reemplaza las comas entre comillas
Código PHP:
$datos preg_replace_callback('/(?<=,")(.*?)(?=")/'create_function('$e''return str_replace(",", "#coma#", $e[1]);'), $datos); 
__________________
More about me...
~ @rhyudek1
~ Github
  #7 (permalink)  
Antiguo 27/08/2010, 11:10
 
Fecha de Ingreso: agosto-2010
Mensajes: 3
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: cortar cadenas php

si no te sirve el formato de valores separados por coma, puedes usar expresiones regulares. Eso si, el formato debe ser igual.
Para el caso que pusiste, una linea del CSV tendria este formato:

Cita:
001,"Carros, Inc. - obo Maersk Line, Inc.",5129706,5129706
por lo tanto, una expresion regular que tome la informacion requerida seria:

Cita:
^(\d+),"([^"]+)",(\d+),(\d+)$
por lo tanto tu codigo php lo cambiaria a lo siguiente:


Código PHP:
$file fopen ($ruta"r"); //abro el archivo 
$preg_pattern '/^(\d+),"([^"]+)",(\d+),(\d+)$/';


// recorro los datos                            
while( $data fgets($file,2048) ){ 

    
/*formo las cadena para hacer el insert 
        ejemplo: 
         
        (001,"Carros, Inc. - obo Maersk Line, Inc.",5129706,5129706) 
       para despues hacer esto: 
       $query = "REPLACE INTO  cat_clientesR(no_centro,empresa,no_cliente,referencia_sistema) VALUES ".$vals.""; 

       mysql_query($query,$conexion); 
    */ 
    
    
    
if( preg_match$preg_pattern trim($data) , $matches ) ){
        
$no_centro $matches[1];
        
$empresa $matches[2];
        
$no_cliente $matches[3];
        
$referencia_sistema $matches[4];
    
        
$sql_query "REPLACE INTO cat_clientes (no_centro,empresa,no_cliente,referencia_sistema) VALUES($no_centro,'$empresa',$no_cliente,$referencia_sistema)";
    
        
mysql_query($sql_query,$conexion);     
    }else{
        
// echo "Error en linea: '$data'<br>";
    
}



espero te sirva !
  #8 (permalink)  
Antiguo 27/08/2010, 11:18
 
Fecha de Ingreso: mayo-2009
Mensajes: 53
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: cortar cadenas php

Cita:
Iniciado por Nicolazo Ver Mensaje
si no te sirve el formato de valores separados por coma, puedes usar expresiones regulares. Eso si, el formato debe ser igual.
Para el caso que pusiste, una linea del CSV tendria este formato:



por lo tanto, una expresion regular que tome la informacion requerida seria:



por lo tanto tu codigo php lo cambiaria a lo siguiente:


Código PHP:
$file fopen ($ruta"r"); //abro el archivo 
$preg_pattern '/^(\d+),"([^"]+)",(\d+),(\d+)$/';


// recorro los datos                            
while( $data fgets($file,2048) ){ 

    
/*formo las cadena para hacer el insert 
        ejemplo: 
         
        (001,"Carros, Inc. - obo Maersk Line, Inc.",5129706,5129706) 
       para despues hacer esto: 
       $query = "REPLACE INTO  cat_clientesR(no_centro,empresa,no_cliente,referencia_sistema) VALUES ".$vals.""; 

       mysql_query($query,$conexion); 
    */ 
    
    
    
if( preg_match$preg_pattern trim($data) , $matches ) ){
        
$no_centro $matches[1];
        
$empresa $matches[2];
        
$no_cliente $matches[3];
        
$referencia_sistema $matches[4];
    
        
$sql_query "REPLACE INTO cat_clientes (no_centro,empresa,no_cliente,referencia_sistema) VALUES($no_centro,'$empresa',$no_cliente,$referencia_sistema)";
    
        
mysql_query($sql_query,$conexion);     
    }else{
        
// echo "Error en linea: '$data'<br>";
    
}



espero te sirva !
gracias a todos voy a probar el codigo de Hidek1 y Nicolazo aber si me sale en un ratito mas ando por aca aver que paso
  #9 (permalink)  
Antiguo 27/08/2010, 11:19
 
Fecha de Ingreso: mayo-2009
Mensajes: 53
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: cortar cadenas php

Cita:
Iniciado por Hidek1 Ver Mensaje
reemplaza las comas entre comillas
Código PHP:
$datos preg_replace_callback('/(?<=,")(.*?)(?=")/'create_function('$e''return str_replace(",", "#coma#", $e[1]);'), $datos); 
no entendi tu codigo como seria mas o menos con el codigo que puse?
es que no entiendo muy bien las expreciones regulares un saludo.
  #10 (permalink)  
Antiguo 27/08/2010, 11:25
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 5 meses
Puntos: 334
Respuesta: cortar cadenas php

ponelo antes del while()... cambia $datos por $data... para que funcione en tu código..
lo unico que hace es capturar las variables dentro de comillas " " y si tienen una coma adentro.. la reemplaza por la palabra #coma#.. asi no molesta luego..
no olvides antes de mostrar los datos hacer un
str_replace("#coma#", ",", $data);
para que se vea normal!
saludos!
__________________
More about me...
~ @rhyudek1
~ Github
  #11 (permalink)  
Antiguo 27/08/2010, 11:27
 
Fecha de Ingreso: mayo-2009
Mensajes: 53
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: cortar cadenas php

voy a tratar de hacerlo aver si me sale oye que bueno eres en esto, ahorita mismo lo pruebo y te digo como voy, gracias.
  #12 (permalink)  
Antiguo 27/08/2010, 11:33
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 5 meses
Puntos: 334
Respuesta: cortar cadenas php

intentalo asi
Código PHP:
$file fopen ($ruta"r");
$separador ",";
$delimitador "/n";
$file preg_replace_callback('/(?<=,")(.*?)(?=")/'create_function('$e''return str_replace(",", "#coma#", $e[1]);'), $file);
while((
$data=fgetcsv($file,2048,$separador,$delimitador))!==false){
    
$vals.="(";
    foreach(
$data as $row){
        
$row str_replace("#coma#"","$row);
        
$vals.=$row;
        
$vals.=",";
    }
    
$vals substr($vals,0,-1);
    
$vals.="),";

__________________
More about me...
~ @rhyudek1
~ Github
  #13 (permalink)  
Antiguo 27/08/2010, 12:21
 
Fecha de Ingreso: mayo-2009
Mensajes: 53
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: cortar cadenas php

Si me salio casi todo pero hubo un problema por que aveces no viene la empresa y solo trae espacios en blanco en su lugar entonces ocurrio algo como esto:

Cita:
2003,""#coma#393837
¿Como que podria hacer en esos casos?
  #14 (permalink)  
Antiguo 27/08/2010, 12:33
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 5 meses
Puntos: 334
Respuesta: cortar cadenas php

mmm bueno eso no deberia pasar.. intenta ponerle una coma a la regex
'/(?<=,")(.*?)(?=",)/' haber si te sirve
__________________
More about me...
~ @rhyudek1
~ Github
  #15 (permalink)  
Antiguo 27/08/2010, 12:39
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: cortar cadenas php

la regex correcta sería:
Cita:
([\'\"]?).+?(?(\\1)\\1)
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #16 (permalink)  
Antiguo 27/08/2010, 13:38
 
Fecha de Ingreso: mayo-2009
Mensajes: 53
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: cortar cadenas php

como lo utilizo?
por que asi me marca error

$datos[$c] = preg_replace_callback(([\'\"]?).+?(?(\\1)\\1), create_function('$e', 'return str_replace(",", "#coma#", $e[$c]);'), $datos[$c]);
  #17 (permalink)  
Antiguo 27/08/2010, 16:51
 
Fecha de Ingreso: mayo-2009
Mensajes: 53
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: cortar cadenas php

Al final lo resolvi de una manero muy poco comun, pero me funciono gracias a todos por ayudarme ahy va el codigo por si a alguien le sirve:

Código PHP:
     $file fopen ($ruta"r");
        
$separador "~~";//lo utilizo como separador por que es muy dificil que en una cadena normal vengan estos caracteres
        
$delimitador "/n";
        
$c=0;
        
$vals="";
        
$comillas "\"";
        
$coma ",";
                  
            while((
$data=fgetcsv($file,2048,$separador,$delimitador))!==false){
               if(
$c!=0){//la primer fila son los titulos de las columnas
                
$datos[$c] = $data;
                
$comillasdoblesmascoma='""';
                
$espaciosnblanco "~~dhamaso~~";
                
$fil str_replace(",,",',"",',$datos[$c]);//parche para cuando no trae comillas y viene asi por ejemplo en alguna columna --> (,,)  esto pasa por que no generaron el archivo separado por comas bien (,"F",) si no --> (,F,)
                
$fila str_replace($comillasdoblesmascoma,$espaciosnblanco,$fil);
                
$fila preg_replace_callback('/(?<=,")(.*?)(?=")/'create_function('$e''return str_replace(",", "#coma#", $e[1]);'), $fila);       

                  
$vals.="(";
                  
$registro explode($coma,$fila[0]);
                  
$i 0;
                  foreach(
$registro as $row){
                        if(
ereg($comillas,$row)){//si el campo viene con comillas
                              
if(ereg("#coma#",$row)){
                                   
$row str_replace("#coma#",",",$row);
                                   
$vals.=$row;
                                   
$vals.=$coma;
                              }else{
                                   
$vals.=$row;
                                   
$vals.=$coma;
                              }
                        }
                        else{
//si el campo viene sin comillas o es ~~dhamaso~~
                              
if(ereg("~~dhamaso~~",$row)){
                                   
$row =   str_replace("~~dhamaso~~",$comillasdoblesmascoma,$row);
                                   
$vals.=$row;
                                   
$vals.=$coma;
                               }else{
                                   
$vals.=$comillas;
                                   
$vals.=$row;
                                   
$vals.=$comillas;
                                   
$vals.=$coma;
                               }
                        }
                        
$i++;
                  }
                  
$vals substr($vals,0,-1);
                  
$vals.="),";                
                  }
                  
$c++;
              }

              
$vals substr($vals,0,-1);
              
$msg "";
              
$msgerror "Error al Ejecutar Instruccion";                                            
              
$query "REPLACE INTO ".$tabla."(".$campos.") VALUES ".$vals."";//uso el replace en lugar del insert por que esta instruccion me sirve para verificar si ya existe el id del registro clave, si es asi hago un update y no un insert
              
$res sql_query($query,$db);

              if(
ereg($msgerror,$res)){
                
$msg.=$res;
              }else{
                
$msg.="Se aplicaron los cambios correctamente...";
              }

              echo(
$msg);

   
fclose ($file); 

Etiquetas: cadenas, cortar
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 13:41.