Página 1 de 1

Guardar salto de línea en campo de CSV

NotaPublicado: 2016-09-02 09:50 @451
por danimera
Buen día. Esta vez tengo un escenario un poco raro.

Mi base de datos es todo un grupo de archivos CSV, que manejo con DBD::CSV super bien.
Ahora lo que quiero es, en un campo, guardar saltos de línea pero que no afecten el CSV.

Tengo un formulario que tiene un campo con FCKeditor para que el usuario ponga su HTML ahí, pero quiero conservar la sangría y los saltos de línea, solo para ese campo. El problema es que cuando guardo el valor de ese campo hago lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 my $ch = $field->{'content'};
  2.                        
  3.                 $ch =~ s/\r/<br>/gi;
  4.                 $ch =~ s/\n/<br>/gi;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Y claro, cuando cargo el valor en el campo, todos los saltos de línea se vuelven '<br>' cosa que no es que me agrada de a mucho, antes utilizaba un módulo llamado CGI::FCKeditor pero ya no funciona con los navegadores modernos...

Así que mi cuestión es cómo mantener el árbol generado en el fckeditor sin dañar el fichero csv.

Re: Guardar salto de línea en campo de CSV

NotaPublicado: 2016-09-02 12:51 @577
por explorer
Según leo el manual de DBD::CSV, se utiliza el módulo Text::CSV_XS para hacer la lectura/escritura de los registros, y leyendo la especificación que aparece en esa página de manual (traducido):
CSV es un formato de datos que tiene campos/columnas separado por el carácter coma y registros/filas separados por (caracteres) nuevas líneas. Campos que contienen un carácter especial (coma, nueva línea o doble comilla), se debe encerrar entre comillas dobles.

Así que sí puedes guardar los caracteres de fin de línea en un campo.

Sobre el tema de convertirlo a '<br>', es algo que he hecho mucho, y que sigo haciendo. La clave está, en la salida, para que lo haga de forma literal, no "escapada", que el módulo CGI hace si cierta opción está activada.

Para ello, aunque a veces uso CGI, la salida lo hago por medio de Template Toolkit, y asunto resuelto.

El único problema que queda, a la hora de sacar código literal, es la evitar ataques XSS, así que hay que hacer un prefiltrado a la hora de admitir entrada por parte del usuario.

Re: Guardar salto de línea en campo de CSV

NotaPublicado: 2016-09-05 08:26 @393
por danimera
:O Muchas gracias, explorer, creo entonces que lo tengo, aunque se me hace un poco raro hacer algo como
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $ch = $field->{'content'};                    
  2. $ch =~ s/\r/"\r"/gi;
  3. $ch =~ s/\n/"\n"/gi;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿Lo anterior será válido? En todo caso mi idea es no convertir a BR, realmente no es necesario y no me agrada, solo quiero que no se dañe mi CSV por el uso de un editor tipo FCKEditor.

Re: Guardar salto de línea en campo de CSV

NotaPublicado: 2016-09-05 16:52 @744
por explorer
Hummm... no... esa no es la idea.

Lo que quieres es guardar todo el área 'content' en un único campo CSV, ¿no?

Entonces, se podría hacer esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $ch = '"' . $field->{'content'} . '"';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y ya está entrecomillado.

De todas maneras... yo creo que el módulo Text::CSV es capaz de hacer estas cosas de forma automática, creo.

Re: Guardar salto de línea en campo de CSV

NotaPublicado: 2016-09-07 12:06 @546
por danimera
Bueno, ya lo estoy haciendo: lo guardo en el campo del cvs, pero el problema es que si tengo saltos de líneas entonces se daña el csv. Entonces intentaré
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $ch = '"' . $field->{'content'} . '"';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero el problema en sí es que estoy usando un FCKEditor. Ahí es el problema, ya que si uso un textarea, no tengo problemas.