2009-09-18 26 views

Odpowiedz

24

Można użyć Class:CSV.

use Class::CSV; 

my $csv = Class::CSV->new(
    fields   => [qw/userid username/] 
); 

$csv->add_line([2063, 'testuser']); 
$csv->add_line({ 
    userid => 2064, 
    username => 'testuser2' 
}); 

$csv->print(); 

# 2063,testuser 
# 2064,testuser2 

Edit: Aby uzyskać więcej bibliotek, można search CPAN.

17

Zazwyczaj używamy Text::CSV_XS (co wyżej wymieniony Class::CSV opiera się na)

UPDATE: Komentatorzy poniżej sugerują również, używając Text::CSV który będzie ładować Text::CSV_XS lub, jeśli to nie jest ogłaszany, spadnie z powrotem na Text::CSV_PP że nie ma zależności XS i może być łatwiejszy w instalacji.

+6

To jest najlepsza opcja. Text :: CSV_XS jest wysoce zoptymalizowany i w pełni funkcjonalny z płynnym interfejsem API. Używamy go wszędzie. Autor jest również w moich oczach najbardziej responsywny na wszystkie CPAN, jest dumny z modułu i zapewnia najwyższe wsparcie. Text :: CSV_PP to także świetny sposób, jeśli nie możesz skompilować do _XS, świetnie, jeśli potrzebujesz go później. Właściwa rzecz może się wydarzyć w dzisiejszych czasach, jeśli po prostu użyjesz Text :: CSV –

+2

Uzgodniono z tym ostatnim zdaniem: Po prostu użyj Text :: CSV i załaduje Text :: CSV_XS, jeśli jest dostępny lub wraca do Text :: CSV_PP, jeśli system nie ma zainstalowanej wersji XS. –

+1

@szabgab Czy możesz podać przykład utworzenia pliku CSV z tekstem :: CSV w odpowiedzi? Czytam dokumentację i wydaje się ona bardzo skupiona na analizie CSV, niezbyt jasna, jak ją utworzyć. –

9

Istnieje więcej niż jeden sposób, aby to zrobić.

  • DBD::CSV - Użyj SQL do odczytywania i zapisywania plików CSV.
  • Text::CSV - Twórz i parsuj pliki CSV po linii. Jest to prawie złoty standard obsługi CSV.
  • - Zapewnia filtr CSV dla komponentu POE komponentu POE.
  • Data::Tabular::Dumper::CSV - Zrzuć tabelę bezpośrednio do pliku CSV (obiekty z tym samym interfejsem mogą zostać zrzucone do plików XML lub MS Excel).

Istnieje również wiele innych na CPAN.

Oczywiście, można zignorować to wszystko i po prostu użyć pętli sprzężenia i druk:

my @table = (
    [ 'a', 'b', 'c'], 
    [ 1, 2, 3 ], 
    [ 2, 4, 6 ], 
); 

for my $row (@table) { 
    print join(',', @$row), "\n"; 
} 

Wystarczy uruchomić skrypt i przekierować dane wyjściowe do pliku, Bang! gotowe. Możesz też zwariować i uzyskać uchwyt pliku i wydrukować go bezpośrednio do pliku.

Ale wtedy nie będziesz obsługiwać pól wielowierszowych, ani przecinków wbudowanych, ani żadnej z wielu innych osobliwości, które mogą pojawić się w tym zadaniu przetwarzania danych. Uważaj więc z tym podejściem.

Moje zalecenia:

  • Jeśli budowania aplikacji POE użyć POE :: Filter.
  • Jeśli jesteś potworem SQL i DBI i marzenie w SQL, lub może trzeba zastąpić CSV z prawdziwej bazy danych połączenia, użyj DBD :: SQL.
  • Jeśli masz prostych danych i zaabsorbowana poszukiwaniem cruddy skrypt jednorazowe do formatu niektóre dane do arkusza kalkulacyjnego do strawienia, wydrukować i dołączyć do użytku - to zrobić bez kodu z oczekiwanej długości życia więcej niż 2 godziny.
  • Jeśli chcesz chcesz zrzucić partię danych do postaci CSV lub XML, użyj Data :: Tabular :: Dumper :: CSV.
  • Jeśli piszesz coś, co musi być stabilne, łatwe w utrzymaniu i szybkie, i potrzebujesz maksymalnej kontroli dla wejścia i wyjścia, użyj Text :: CSV. (Zauważ, że POE :: Filter :: CSV, Data :: Tabular :: Dumper :: CSV i DBD :: CSV wszystkie używają Text :: CSV lub Text :: CSV_XS jak do przetwarzania back-end).
Powiązane problemy