Как написать текст в выровненных столбцах в Perl?
Я пытаюсь записать файл из Perl. Я просто хочу записать данные в формате с разделителями табуляции. Однако данные, которые я пишу, имеют разную длину и не выстраиваются в линию.
Например, я пытаюсь написать что-то вроде этого:
Name Education Fav_Car MoneyInBank
josh High School Porche 500
SomeOtherName PHD Hyundai 50000
Я просто хочу, чтобы данные были выстроены с заголовками, которые у меня сверху.
Я выводил данные так:
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);
};
Ответы
Ответ 1
Данные с разделителями-табуляциями (где поля не согласованы по длине) не выстраиваются в очередь при открытии в текстовом редакторе.
Решения:
- Откройте файл в электронной таблице.
- Откройте его в текстовом процессоре, выберите весь текст и определите соответствующие табуляции. (спасибо, Justsalt)
- В текстовом редакторе установите ширину табуляции в значение, большее любого из ваших полей.
- Используйте пробелы вместо вкладок (например,
printf
с шириной поля или форматы).
Например, вы можете использовать
printf("%-15s %-15s %-10s %9s\n", $name, $edu, $car, $cash);
-
после %
вызывает выравнивание поля. Числа (например, деньги) обычно выравниваются по правому краю (это по умолчанию).
Ответ 2
Посмотрите на команду Perl format.
Ответ 3
Посмотрите Perl6:: Form модуль CPAN.
Этот предыдущий вопрос/ответ Какие другие языки имеют возможности и или библиотеки, похожие на Perls Format в stackoverflow, могут помочь.
Ответ 4
В дополнение к способу C printf вы можете динамически регулировать ширину с помощью "*",
printf FILE ("%*s%*s%*s\n", 20, "Name", length($blah), "Ed", 20, "Car");
Ответ 5
printf делает это как в C. Для 20 полей символов:
printf("%20s%20s%20s$20S\n",$name,$ed,$car,$money);
Ответ 6
Если вы работаете в Linux, простым решением будет использование column с флагом -t. просто распечатайте таблицу, разделенную пробелом, в файл и просто используйте команду column в этом файле.
system("column -t file > new_file");