Pregunta

Estoy intentando escribir en un archivo de Perl. Sólo quiero escribir los datos en formato delimitado por tabulaciones. Sin embargo, los datos que estoy escribiendo tienen longitudes variables y no se están alineando.

Por ejemplo, estoy tratando de escribir algo como esto:

Name  Education   Fav_Car  MoneyInBank
josh  High School Porche   500
SomeOtherName  PHD  Hyundai   50000

Solo quiero que los datos se alineen con los encabezados que tengo en la parte superior.

Estoy enviando los datos de esta manera:

 printf FILE ("%s%20s%20s\n", "Name", "Ed", "Car");
 while (($name, $ed, $car) = $sth->fetchrow_array) {
         printf FILE ("%s>>>>>>>>>>>>>%40s%40s\n", $name, $ed, $car);
 };
¿Fue útil?

Solución

Los datos delimitados por tabulaciones (donde los campos no son consistentes en longitud) no se alinean cuando se abren en un editor de texto.

Soluciones:

  • Abre el archivo en una hoja de cálculo.
  • Ábralo en un procesador de textos, seleccione todo el texto y defina las tabulaciones apropiadas. (gracias, Justsalt )
  • En tu editor de texto, establece el ancho de la pestaña en un valor mayor que cualquiera de tus campos.
  • Use espacios en lugar de pestañas (por ejemplo, printf con anchos de campo, o formatos ).

Por ejemplo, podrías usar

printf("%-15s %-15s %-10s %9s\n", $name, $edu, $car, $cash);

El - después de % hace que el campo esté justificado por la izquierda. Los números (como el dinero) suelen estar justificados a la derecha (que es el valor predeterminado).

Otros consejos

Eche un vistazo al comando Pera .

Echa un vistazo a Perl6 :: Form módulo CPAN.

Esta pregunta / respuesta anterior Lo que otros idiomas tienen características o bibliotecas similares al formato Perls en stackoverflow puede ayudar.

Además de la forma en que se imprime C, puede ajustar el ancho dinámicamente con " * " ;,

printf FILE ("%*s%*s%*s\n", 20, "Name", length($blah), "Ed", 20, "Car");

El printf hace esto como en C. Para campos de 20 caracteres:

printf("%20s%20s%20s$20S\n",$name,$ed,$car,$money);
scroll top