¿Cómo escribo texto en columnas alineadas en Perl?
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);
};
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
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);
Si está trabajando en Linux, una solución fácil sería utilizar columna comando del sistema, con la bandera -t. simplemente imprima la tabla separada por espacios en un archivo, y simplemente use el comando de columna en ese archivo.
system("column -t file > new_file");