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

标签 perl string csv

决定尝试学习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"

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

最佳答案

使用 Text::CSV_XSText::CSV .

其他任何事情迟早都会让你发疯。 CSV 在实践中是一种不守规矩的格式,尽管已经制定了规则 (RFC 4180),但它们的定义有些事后,因此某些系统,尤其是 Microsoft,以不同的方式处理它们。 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 ($!)";
}

基于您的样本数据的输出

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 - 在 Perl 中,如何导入示例 CSV,进行基本的文本操作,然后将其保存回 CSV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200944/

相关文章:

regex - 使用 Perl 执行系统命令

java - 我正在尝试从字符串中随机抽取一个单词。 java

php - 如何更快地循环 CSV mysql 更新?

python - 搜索 csv 文件,这是最佳实践?

java - 在 Java 中,是 substring(int k, int y) 还是 substring(int k) 更高效?

php - 每 10 分钟从 CSV 文件更新 MySQL

perl Win32::SerialPort:读取和输入方法之间的区别

windows - 为什么这个 Perl 单行代码不能在 Windows 上运行?

regex - Perl 匹配正则表达式的哪些细微差别会引起头痛?

c++ - 阅读未知数量的单词