App-CSVUtils

 view release on metacpan or  search on metacpan

lib/App/CSVUtils.pm  view on Meta::CPAN

        }
    } elsif ($name_or_idx =~ /\A-[1-9][0-9]*\z/) {
        if (-$name_or_idx > @$fields) {
            die [400, "There are only ".scalar(@$fields)." field(s) but field index $name_or_idx is requested"];
        } else {
            return @$fields + $name_or_idx;
        }
    }

    # not found
    die [404, "Unknown field name/index '$name_or_idx' (known fields include: ".
         join(", ", map { "'$_'" } @$fields).")"];
}

# select one or more fields with options like --include-field, etc
sub _select_fields {
    my ($fields, $field_idxs, $args, $default_select_choice) = @_;

    my @selected_fields;

    my $select_field_options_used;

lib/App/CSVUtils/csv_freqtable.pm  view on Meta::CPAN

        },
    ],

    on_input_header_row => sub {
        my $r = shift;

        # check arguments
        my $field_idx;
        if (defined $r->{util_args}{field}) {
            $field_idx = $r->{input_fields_idx}{ $r->{util_args}{field} };
            die [404, "Field '$r->{util_args}{field}' not found in CSV"]
                unless defined $field_idx;
        }

        $r->{wants_input_row_as_hashref} = 1 if $r->{util_args}{hash};

        # this is a key we add to the stash
        $r->{freqtable} //= {};
        $r->{field_idx} = $field_idx;
        $r->{code} = undef;
        $r->{has_added_field} = 0;

lib/App/CSVUtils/csv_munge_field.pm  view on Meta::CPAN

            test => 0,
            'x.doc.show_result' => 0,
        },
    ],

    on_input_header_row => sub {
        my $r = shift;

        # check that selected field exists in the header
        my $field_idx = $r->{input_fields_idx}{ $r->{util_args}{field} };
        die [404, "Field '$r->{util_args}{field}' not found in CSV"]
            unless defined $field_idx;

        # we add the following keys to the stash
        $r->{code} = compile_eval_code($r->{util_args}{eval}, 'eval');
        $r->{field_idx} = $field_idx;
    },

    on_input_data_row => sub {
        my $r = shift;

t/01-basic.t  view on Meta::CPAN


subtest csv_munge_field => sub {
    my ($res, $stdout);

    require App::CSVUtils::csv_munge_field;

    $res = App::CSVUtils::csv_munge_field::csv_munge_field(input_filename=>"$dir/1.csv", field=>"f1", eval=>"blah +");
    is($res->[0], 400, "error in code -> error");

    $res = App::CSVUtils::csv_munge_field::csv_munge_field(input_filename=>"$dir/1.csv", field=>"f4", eval=>'1');
    is($res->[0], 404, "munging unknown field -> error");

    $stdout = capture_stdout { $res = App::CSVUtils::csv_munge_field::csv_munge_field(input_filename=>"$dir/1.csv", field=>"f3", eval=>'$_ = $_*3') };
    is($stdout, "f1,f2,f3\n1,2,9\n4,5,18\n7,8,27\n", "output");
};

subtest csv_munge_rows => sub {
    my ($res, $stdout);

    require App::CSVUtils::csv_munge_rows;

t/01-basic.t  view on Meta::CPAN

};

subtest "csv_uniq" => sub {
    require App::CSVUtils::csv_uniq;

    my ($res, $stdout);

    write_text("$dir/uniq.csv", "f1,f2,f3\n1,2,a\n4,5,b\n4,7,B\n");

    $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["foo"]);
    is($res->[0], 404, "unknown field -> error") or diag explain $res;

    is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f2"]) }), "", "no duplicate values in field f2");
    is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f1"]) }), "csv-uniq: Duplicate value '4'\n", "duplicate values in field f1 reported");
    is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f1","f3"]) }), "", "no duplicate values in fields f1+f3");
    is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f1","f3"], ignore_case=>1) }), "csv-uniq: Duplicate value '4|b'\n", "Duplicate values (ignore_case) in fields f1+f3");
    is((capture_stdout { $res = App::CSVUtils::csv_uniq::csv_uniq(input_filename=>"$dir/uniq.csv", fields=>["f2"], unique=>1) }), "csv-uniq: Unique value '2'\ncsv-uniq: Unique value '5'\ncsv-uniq: Unique value '7'\n", "unique values reported");
};

subtest "csv_csv, opt: --inplace" => sub {
    require App::CSVUtils::csv_csv;



( run in 1.533 second using v1.01-cache-2.11-cpan-39bf76dae61 )