package Iodef::Pb::Format::Csv; use base 'Iodef::Pb::Format'; use strict; use warnings; sub write_out { my $self = shift; my $args = shift; my $array = $self->SUPER::to_keypair($args); my $config = $args->{'config'}; my @config_search_path = ( 'claoverride', $args->{'query'}, 'client' ); my $cfg_fields = $args->{'fields'} || $self->SUPER::confor($config, \@config_search_path, 'fields', undef); my $cfg_csv_noseperator = $args->{'csv_noseperator'} || $self->SUPER::confor($config, \@config_search_path, 'csv_noseperator', undef); my @header = keys(%{@{$array}[0]}); if($cfg_fields){ @header = @$cfg_fields; } @header = sort { $a cmp $b } @header; my $body = ''; foreach my $a (@$array){ delete($a->{'message'}); # there's no clean way to do this just yet foreach (@header){ if($a->{$_} && !ref($a->{$_})){ # deal with , in the field if($cfg_csv_noseperator){ $a->{$_} =~ s/,/ /g; $a->{$_} =~ s/\s+/ /g; } else { $a->{$_} =~ s/,/_/g; } # strip out non-ascii (typically unicode) chars # there are better ways to do this, but this works for now $a->{$_} =~ tr/\000-\177//cd; } } # the !ref() bits skip things like arrays and hashref's for now... $body .= join(',', map { ($a->{$_} && !ref($a->{$_})) ? $a->{$_} : ''} @header)."\n"; } my $text = '# '.join(',',@header); $text .= "\n".$body; return $text; } 1;