在Perl中,如何导入示例CSV,执行基本文本操作,然后将其保存回CSV?

blu*_*ers 3 csv string perl

决定尝试学习Perl,目前需要处理一些CSV文件.

要开始进行更多高级文本操作,我首先需要一个基本代码:

  • 导入本地CSV
  • 是否有基本的文本操作
  • 保存生成的更改值

导入/处理/导出应支持1000多行和20多列.将提供一个示例CSV文件,但您可以在答案中提供一个.

示例CSV文件:

"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"
Run Code Online (Sandbox Code Playgroud)

如果您有任何疑问,请告诉我 - 这对我来说将是一个巨大的帮助.我的主要关注点是文本操作,但操作没有意义,除非我有办法输入数据并将其导出回文件.此外,如果您对快速创建和调试文本操作有任何建议,那将是一个巨大的帮助.(注意:目前使用应用程序执行此操作,但需要更多控制,并决定尝试使用Perl.)

Jon*_*ler 8

使用Text :: CSV_XSText :: CSV.

任何其他事情迟早会让你疯狂.CSV在实践中是一种不守规矩的格式,虽然有规则(RFC 4180),但它们在某种程度上是事后定义的,所以一些系统,特别是微软,以不同的方式处理它们.MS确实首先实现了这一目标,但不同MS产品识别的CSV格式之间存在差异.


Rehash of 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 ($!)";
}
Run Code Online (Sandbox Code Playgroud)

根据您的样本数据输出

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
Run Code Online (Sandbox Code Playgroud)