Как написать текст в выровненных столбцах в 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);
 };

person Community    schedule 06.03.2009    source источник


Ответы (6)


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

Решения:

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

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

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

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

person cjm    schedule 06.03.2009
comment
Или откройте его в текстовом редакторе и определите соответствующие позиции табуляции. - person Justsalt; 06.03.2009

Взгляните на команду Perl format.

person Paul Tomblin    schedule 06.03.2009
comment
Я бы не стал использовать формат для каких-либо новых проектов, вместо этого использовал бы Perl6::Form. - person Brad Gilbert; 07.03.2009

Взгляните на модуль CPAN Perl6::Form.

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

person draegtun    schedule 06.03.2009

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

printf FILE ("%*s%*s%*s\n", 20, "Name", length($blah), "Ed", 20, "Car");
person Adam Flott    schedule 07.03.2009

Функция printf делает это так же, как в C. Для 20 символов поля:

printf("%20s%20s%20s$20S\n", $name, $ed, $car, $money);
person Brian Carlton    schedule 06.03.2009
comment
Должны ли они быть %-20 для выравнивания по левому краю? - person Daniel LeCheminant; 06.03.2009
comment
как я могу сделать их левыми? - person ; 06.03.2009
comment
@styris: см. комментарий Даниэля Л. по этому вопросу! - person j_random_hacker; 07.03.2009
comment
Что означает $20S? - person Peter Mortensen; 23.11.2020

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

system("column -t file > new_file"); 
person Mattan    schedule 16.07.2013