• Publicidad

Leer el último elemento de una frase del fichero

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: Leer el último elemento de una frase del fichero

Notapor explorer » 2010-06-29 08:06 @379

¡Ja!... creo que empiezo a ver la luz...

Esa salida es CORRECTA porque los caracteres de finales de línea, al ser retornos de carro, coloca el cursor en la primera columna. Por eso solo vemos una sola línea.

Pero, ¿por qué pasa esto? No conozco ni tengo un MacOS por aquí, pero sospecho que el shell en donde estás trabajando con el Perl, en línea de comandos, si es un verdadero UNIX (o hijo de), entonces sus finales de línea será el avance de línea 0x0a.

Por eso hay ese comportamiento dispar: tu Excel genera los csv con finales de línea tipo Mac porque estás en un Mac. Pero en la línea de comandos, no estás en un Mac, si no en un UNIX, por lo que el final de línea es distinto.

Es lo que creo, claro...

Una forma de probarlo... Prueba esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
perl -le 'print join "\n", map { "[$_]" } <>' Libro2.csv | hexdump -C
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Si sale lo que sospecho, entonces tu programa se arreglará con solo poner $/ = "\r"; antes de iniciar la lectura de las líneas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Leer el último elemento de una frase del fichero

Notapor zangre » 2010-06-30 02:14 @135

Cada día odio un poquito más a mi jefe, con lo fácil que habría sido trabajar sobre Linux... :lol:

Por suerte, mientras hay esto, me estoy peleando con Ajax para hacer bonita la parte de selec * from lo que sea. :D

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
mac-2:htdocs miau$ perl -le 'print join "\n", map { "[$_]" } <>' Libro2.csv | hexdump -C
00000000  5b 31 3b 32 3b 33 3b 34  0d 38 3b 37 3b 36 3b 35  |[1;2;3;4.8;7;6;5|
00000010  0d 39 3b 31 30 3b 31 31  3b 31 32 0d 31 36 3b 31  |.9;10;11;12.16;1|
00000020  35 3b 31 34 3b 31 33 5d  0a                       |5;14;13].|
00000029
 
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Pues mira, así sí que sale todo. ^^

Igualmente si te fijas la estructura de capetas de un Mac, te aseguro que es clavadita a cualquier Linux. Hay algunas divergencias, pero por el resto... Es más, algunos compis han flipado con que la lupa que hay en el Mac, también esté en el Ubuntu que tienen como máquina virtual, ¡pero si los dos derivan de lo mismo! Ains :lol:
Aún así en el shell hay cosas que no funcionan como en uno de Linux, los install y similares.
Es curioso. :P
Avatar de Usuario
zangre
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2010-06-16 06:35 @316
Ubicación: Barcelona

Re: Leer el último elemento de una frase del fichero

Notapor explorer » 2010-06-30 04:54 @246

Bien, ahora viendo ese resultado, ya tenemos la confirmación:

1.- El fichero csv tiene los finales de línea en 0x0d, ya que estáis en Mac.

2.- Los finales de línea desde la línea de comandos es 0x0a, como en cualquier Unix. Se ve que hay uno en la salida, al final (lo pone perl, por efecto de la opción -l).

3.- Se observa que Perl se lee todo el fichero de una vez (solo hay un par de corchetes), porque, efectivamente, no encuentra ningún 0x0a como separador de líneas.

Así que la solución es muy sencilla... edita el programa y justo antes de empezar a leer las líneas, pones

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. local $/ = "\r";   # Final de línea que vamos a leer
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Prueba de que es cierto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
> perl -l -n -e 'BEGIN { $/ = "\r" } print "[$_]" ' Libro2.csv
[1;2;3;4]
[8;7;6;5]
[9;10;11;12]
[16;15;14;13]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En el BEGIN, que se ejecuta una vez al principio del programa, le estamos diciendo cómo son los finales de línea. Con la opción -n iniciamos un bucle por todo el Libro2.csv. La opción -l hace un chomp() a cada línea (ahora ya sabe qué carácter debe quitar). Y también añade un carácter de fin de línea a la salida (será un "\n" en UNIX, un carácter 0x0a). En cada línea, la metemos entre corchetes y la sacamos fuera.

Ahí tienes tus líneas...

Otra opción... si quieres convertir Libro2.csv a finales de línea tipo Unix, puedes probar a ejecutar el comando tr desde la línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
tr '\r' '\n' < Libro2.csv > Libro2.txt
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
que es lo mismo que hacerlo en Perl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -p -e 's/\r/\n/g' < Libro2.csv > Libro2.txt
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Pero bueno, ya no te hace falta porque ya sabes cómo indicarlo desde dentro del programa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Leer el último elemento de una frase del fichero

Notapor zangre » 2010-06-30 05:14 @260

Mira que llevo dos años en clase programando a saco en mil lenguajes, pero estoy aprendiendo el triple contigo. :lol:

Muchas gracias, funciona, genial. :)
Avatar de Usuario
zangre
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2010-06-16 06:35 @316
Ubicación: Barcelona

Re: Leer el último elemento de una frase del fichero

Notapor zangre » 2010-07-01 06:43 @321

Esto ya es lo último, ahora si no le quito la línea, esa de los saltos de línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. local $/ = "\r";   # Final de línea que vamos a leer
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Me junta todo en una línea. Así que he optado por hacer un maxi comentario de "si no te crea la tabla, borra la almohadilla", porque por lo visto, dependiendo de cómo exportes el .csv del excel monta los saltos de linea de una manera u otra. :o
Avatar de Usuario
zangre
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2010-06-16 06:35 @316
Ubicación: Barcelona

Re: Leer el último elemento de una frase del fichero

Notapor explorer » 2010-07-01 06:54 @329

¿Cómo que depende de cómo exportes el csv? El formato debería ser siempre el mismo...

Eso lo puedes comprobar con el hexdump.

Una solución radical es la de usar una expresión regular para separar las líneas.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# Leemos todo el fichero de golpe
local $/ = undef;
open my $handle, q[<], 'Libro2.csv';
my $fichero = <$handle>;
close $handle;

# Separamos por líneas
my @fichero = split /[\r\n]+/, $fichero;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y ya está, ya no dependes de cómo sean los finales de línea.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Leer el último elemento de una frase del fichero

Notapor zangre » 2010-07-01 13:56 @622

La situación con la que me he encontrado es: cuando creas un fichero de nuevo y lo guardas en .csv, entonces necesita especificar el salto de línea. Cuando lo que haces es guardar como de un fichero que estaba en otro formato (en este caso .xslx), entonces no lo necesitas.

He estado hablando con uno de mis compis que será el que trabajará sobre esta mini-aplicación y me ha dicho que hay una función que reconoce el tipo de salto de línea. Tal vez así se podría hacer, ¿no? Porque encima este hombre tiene preferencia con trabajar sobre Ubuntu (tiene una máquina virtual) y bueno, supongo que al final será un cachondeo todo esto.
Avatar de Usuario
zangre
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2010-06-16 06:35 @316
Ubicación: Barcelona

Re: Leer el último elemento de una frase del fichero

Notapor explorer » 2010-07-01 14:01 @626

Usando la expresión regular anterior, no deberías tener más problemas. Tú deja que el cliente cree el fichero csv como le dé la gana y donde le dé la gana, que tu programa Perl será capaz de leerlo. Y solo tienes que preocuparte de preguntar al usuario de la aplicación cómo tiene que ser la salida que necesita.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Leer el último elemento de una frase del fichero

Notapor zangre » 2010-07-02 01:41 @112

Ok. ;)

Mientras estaba ese problema he ido haciendo con Ajax y demás, una chorri aplicación para consultas simples (vamos, lo que hace el PHPMyAdmin, pero con Perl, que era lo que ellos necesitaban para modificar), y hoy haré que las variables que salen, las guarde en un .csv a ver si el Excel me lo importa. :)
Avatar de Usuario
zangre
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2010-06-16 06:35 @316
Ubicación: Barcelona

Re: Leer el último elemento de una frase del fichero

Notapor zangre » 2010-07-02 07:31 @355

Una preguntita, porque me estoy volviendo majara, y no sé si estoy usando mal las expresiones regulares.

Si en la cabecera, en lugar de sólo el nombre de las columnas también tengo el tipo de variable que tengo, algo como esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
var1 INT,var2 INT,var3 INT,var4 VARCHAR(10),var5 VARCHAR(10),var6 INT,var7 INT,var8 INT,var9 INT,var10 FLOAT,var11 FLOAT
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Cuando sólo quiero sacar el nombre de las columnas, ¿no debería ser algo como esto?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$cabecera =~ s/\s*,/,/g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Porque seguro que hay una forma simple de hacerlo, sino al final empezaré con los splits, y los bucles para sacarlo o tal vez pidiendo a la bbdd que me dé el nombre de las columnas una vez creada. Tiene que haber algo más sencillo, como lo de la expresión regular, pero llevo toda la mañana sin sacar nada en claro.
Avatar de Usuario
zangre
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2010-06-16 06:35 @316
Ubicación: Barcelona

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 1 invitado

cron