2009-03-06 40 views
18

Tôi đang cố ghi vào một tập tin từ Perl. Tôi chỉ muốn ghi dữ liệu ở định dạng phân tách tab. Tuy nhiên, dữ liệu mà tôi viết có độ dài khác nhau và không xếp hàng.Làm cách nào để viết văn bản trong các cột được căn chỉnh trong Perl?

Ví dụ tôi đang cố gắng để viết một cái gì đó như thế này:

Name Education Fav_Car MoneyInBank 
josh High School Porche 500 
SomeOtherName PHD Hyundai 50000 

Tôi chỉ muốn các dữ liệu được xếp hàng với các tiêu đề mà tôi có trên đầu trang.

tôi xuất dữ liệu như vậy:

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); 
}; 

Trả lời

26

dữ liệu Tab được phân định (trong đó các lĩnh vực không phù hợp trong thời gian) không xếp hàng khi mở cửa vào một trình soạn thảo văn bản.

Giải pháp:

  • Mở tập tin trong một bảng tính.
  • Mở trong bộ xử lý văn bản, chọn tất cả văn bản và xác định các điểm dừng tab phù hợp. (cảm ơn, Justsalt)
  • Trong trình chỉnh sửa văn bản, hãy đặt độ rộng của tab thành giá trị lớn hơn bất kỳ trường nào của bạn.
  • Sử dụng dấu cách thay vì tab (ví dụ: printf với độ rộng trường hoặc formats).

Ví dụ, bạn có thể sử dụng

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

Các - sau % gây lĩnh vực này bị bỏ lại hợp lý. Các số (như tiền) thường được chứng minh đúng (là mặc định).

+1

Hoặc mở nó trong trình xử lý văn bản và xác định các điểm dừng tab thích hợp. – Justsalt

6

Hãy xem lệnh Perl format.

+0

Tôi sẽ không sử dụng định dạng cho bất kỳ dự án mới nào, sử dụng Perl6 :: Form thay thế. –

1

Các printf thực hiện điều này như trong C. Đối với 20 trường kiểu ký tự:

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

Những người cần phải là% -20 để biện minh cho trái? –

+0

làm thế nào tôi có thể làm cho họ trái hợp lý? –

+0

@styris: Xem nhận xét của Daniel L về câu hỏi này! –

2

Ngoài printf cách C của bạn có thể điều chỉnh độ rộng tự động với "*",

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

Nếu bạn đang làm việc trên Linux, một giải pháp dễ dàng sẽ được sử dụng column lệnh hệ thống, với sự - t cờ. chỉ cần in bảng cách nhau vào một tệp và chỉ sử dụng lệnh cột trên tệp đó.

system("column -t file > new_file"); 
Các vấn đề liên quan