Как написать текст в выровненных столбцах в Perl? - PullRequest
19 голосов
/ 06 марта 2009

Я пытаюсь записать файл из 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);
 };

Ответы [ 6 ]

28 голосов
/ 06 марта 2009

Данные с разделителями табуляции (где поля не согласованы по длине) не выстраиваются при открытии в текстовом редакторе.

Решения:

  • Открыть файл в электронной таблице.
  • Откройте его в текстовом редакторе, выделите весь текст и определите подходящие позиции табуляции. (спасибо, Justsalt )
  • В текстовом редакторе установите для ширины вкладки значение, превышающее любое из ваших полей.
  • Используйте пробелы вместо вкладок (например, printf с шириной поля или форматы ).

Например, вы можете использовать

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

- после % заставляет поле выравниваться по левому краю. Числа (например, деньги) обычно выровнены по правому краю (по умолчанию).

6 голосов
/ 06 марта 2009

Посмотрите на команду Perl format .

4 голосов
/ 06 марта 2009

Посмотрите на Perl6 :: Form CPAN модуль.

Этот предыдущий вопрос / ответ Какие другие языки имеют функции и библиотеки, аналогичные формату Perls в stackoverflow может помочь.

2 голосов
/ 07 марта 2009

В дополнение к способу печати printf вы можете динамически регулировать ширину с помощью "*",

printf FILE ("%*s%*s%*s\n", 20, "Name", length($blah), "Ed", 20, "Car");
1 голос
/ 16 июля 2013

Если вы работаете в Linux, простым решением будет использование системной команды column с флагом -t. просто напечатайте разделенную пробелами таблицу в файл и просто используйте команду столбца для этого файла.

system("column -t file > new_file"); 
1 голос
/ 06 марта 2009

printf делает это как в C. Для 20 символьных полей:

printf("%20s%20s%20s$20S\n",$name,$ed,$car,$money);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...