2009-03-06 1 views
18

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

ответ

26

Tab разделителями данных (где поля не согласуются в длину) не выстраиваются в очередь при открытии в текстовом редакторе.

Решения:

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

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

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

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

+1

Или откройте его в текстовом процессоре и определите соответствующие табуляции. – Justsalt

6

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

+0

Я бы не использовал формат для каких-либо новых проектов, вместо этого используйте Perl6 :: Form. –

1

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

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

Должны ли они быть% -20 влево оправдаться? –

+0

как я могу сделать их левыми оправданными? – 2009-03-06 16:44:42

+0

@styris: Прокомментируйте комментарий Daniel L на этот вопрос! –

2

В дополнение к Printf ходового языка C вы можете регулировать ширину динамически с «*»,

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

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

system("column -t file > new_file"); 
Смежные вопросы