В Perl, как мне импортировать образец CSV, выполнить основные операции с текстом, а затем сохранить его обратно в CSV? - PullRequest
3 голосов
/ 17 ноября 2010

Решили попробовать и изучить Perl, и в настоящее время необходимо обработать несколько файлов CSV.

Чтобы начать выполнять более сложные манипуляции с текстом, мне сначала нужен базовый код, который:

  • Импортирует локальный CSV
  • Выполняет базовые манипуляции с текстом
  • Сохраните полученные измененные значения

Импорт / процесс / экспорт должен поддерживать более 1000 строк и более 20 столбцов.Собираюсь предоставить образец CSV-файла, но не стесняйтесь указывать его в своем ответе.

SAMPLE CSV FILE:

"EmployeeName","OfficeHistory","JobLevelHistory"
"John Smith",501,"Engineer"
"John Smith",601,"Senior Engineer"
"John Smith",701,"Manager"
"Alex Button",601,"Senior Assistant"
"Alex Button",454,"Manager"

Если у вас есть какие-либо вопросы, дайте мне знать - это будетОГРОМНАЯ помощь во мне.Мой главный фокус - манипулирование текстом, но манипуляции не имеют смысла, если у меня нет способа ввода данных и их экспорта в файл. Кроме того, если у вас есть предложения по быстрому созданию и отладке текстовых манипуляций, это тоже очень поможет. (ПРИМЕЧАНИЕ. В настоящее время для этого используется приложение, но требуется больше контроля, и он решил дать Perlпопробовать.)

Ответы [ 2 ]

8 голосов
/ 17 ноября 2010

Используйте Текст :: CSV_XS или Текст :: CSV .

Все остальное рано или поздно сведет вас с ума.CSV на практике является недисциплинированным форматом, хотя существуют определенные правила ( RFC 4180 ), но они были определены несколько post hoc , поэтому некоторые системы, особенно Microsoft, обрабатывают их по-разному.MS действительно добралась до этого первой, но есть различия между форматами CSV, распознаваемыми различными продуктами MS.


Перефразирование страницы справки Text :: CSV

#!/usr/bin/env perl
use strict;
use warnings;
use Text::CSV;

my @rows;

# Read the CSV file
{
    my $csv = Text::CSV->new()
        or die "Cannot use Text::CSV ($!)";
    my $file = "data.csv";
    open my $fh, '<', $file
        or die "Cannot open $file ($!)";

    while (my $row = $csv->getline($fh))
    {
        push @rows, $row;
    }
    $csv->eof or $csv->error_diag();

    close $fh
        or die "Failed to close $file ($!)";
}

# Munge the data
{
    foreach my $row (@rows)
    {
        foreach my $col (@{$row})
        {
            $col = uc($col);
        }
        print "\n";
    }
}

# Write the data
{
    my $csv = Text::CSV->new()
        or die "Cannot use Text::CSV ($!)";
    my $file = "output.csv";
    open my $fh, '>', $file
        or die "Cannot open $file ($!)";
    $csv->eol("\n");
    foreach my $row (@rows)
    {

        $csv->print($fh, \@{$row})
            or die "Failed to write $file ($!)";
    }
    close $fh
        or die "Failed to close $file ($!)";
}

Вывод на основеваши данные образца

EMPLOYEENAME,OFFICEHISTORY,JOBLEVELHISTORY
"JOHN SMITH",501,ENGINEER
"JOHN SMITH",601,"SENIOR ENGINEER"
"JOHN SMITH",701,MANAGER
"ALEX BUTTON",601,"SENIOR ASSISTANT"
"ALEX BUTTON",454,MANAGER
2 голосов
/ 17 ноября 2010

Text :: xSV на самом деле, на мой взгляд, гораздо более приятный интерфейс, чем Text :: CSV [_XS], и вы можете рассмотреть возможность его использования.

Базовыйвызов так же прост, как

my $csv = Text::xSV->new(filename => "file.csv");

или даже

my $csv = Text::xSV->new;

, который будет читать из файлов, названных в командной строке (если они есть), или считывать из стандартного ввода, изапись в стандартный вывод.

Оттуда работать с данными так же просто, как

while (my @row = $csv->get_row) {
  # Do stuff with the fields in @row
}

или, если первое, что вы делаете, это

$csv->read_header;

затем он прочитает первую строку файла в виде списка имен полей, а затем вы сможете получить доступ к своим данным следующим образом:

while (my %row = $csv->fetchrow_hash) {
  print $row{EmployeeName};
}

, что избавляет вас от необходимости считать порядок столбцов и ссылаться на них.им по номеру.Конечно, есть и функции для вывода, и они такие же простые - все это в документации.Если вы одновременно читаете и пишете, вы создаете два разных объекта Text::xSV, один для ввода и один для вывода.

Полностью обработанный эквивалент фильтра «прописные буквы всего» в другом ответе:

#!/usr/bin/perl
use strict;
use warnings;
use Text::xSV;

my $in = Text::xSV->new("data.csv");
my $out = Text::xSV->new("output.csv");

while (my $row = $in->get_row) {
    for my $col (@row) {
        $col = uc $col;
    }
    $out->print_row(@row);
}

Так как это всего лишь служебный скрипт, мы позволяем Text::xSV просто вызвать для нас исключение, если есть какие-либо проблемы с открытием файла, что (в отличие от open) это сделает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...