📜  珀尔 |读取 CSV 文件(1)

📅  最后修改于: 2023-12-03 15:11:12.641000             🧑  作者: Mango

珀尔 | 读取 CSV 文件

在珀尔(Perl)编程语言中,读取 CSV(Comma-Separated Values,逗号分隔值)文件是一种常见的操作。CSV 是一种文本文件格式,用于存储基于表格的数据,例如电子表格和数据库。

本文将介绍如何使用 Perl 读取 CSV 文件。

CSV 文件格式

CSV 文件由若干行组成,每一行都以换行符(\n)结尾。每一行由若干个字段组成,每个字段之间用逗号(,)分隔。字段可以包含任意字符,但是如果包含逗号或者换行符等特殊符号,需要用引号(")括起来。如果一个字段需要包含引号,那么需要在引号前加上一个引号,例如:

Name,Age,Gender
Alice,25,Female
"Bob","32"","Male"
"Charlie, Brown",40,Male

上面的 CSV 文件包含三列,分别是姓名、年龄和性别。注意,第二行和第三行中,Bob 姓氏后面的引号被转义了,而在第四行中,Charlie Brown 的姓名被引号括起来并包含了逗号。

使用 Text::CSV 模块读取 CSV 文件

Perl 中可以使用 Text::CSV 模块来读取 CSV 文件。Text::CSV 提供了正则表达式和字符串分割两种方式来解析 CSV 文件,可以自动处理引号、转义等情况,非常方便。

以下是一个简单的例子:

use Text::CSV;

my $csv = Text::CSV->new({binary => 1});

open(my $fh, "<", "data.csv") or die "data.csv: $!";
while (my $row = $csv->getline($fh)) {
    print join(",", @$row), "\n";
}
close($fh);

上面的代码首先通过 Text::CSV->new 创建了一个 CSV 解析对象 $csv,然后通过 open 打开了名为 data.csv 的文件(如果文件不存在或者无法打开,会抛出一个异常)。然后循环读取 CSV 文件中的每一行,并打印出来。

需要注意的是,上面的代码默认使用了字符串分割的方式解析 CSV 文件,如果需要使用正则表达式的方式,需要在创建 CSV 解析对象时传入 sep_char => qr(/t) 参数。参考代码:

use Text::CSV;

my $csv = Text::CSV->new({
    binary => 1,
    sep_char => qr(\t),
});

open(my $fh, "<", "data.tsv") or die "data.tsv: $!";
while (my $row = $csv->getline($fh)) {
    print join(",", @$row), "\n";
}
close($fh);

上面的代码读取了一个名为 data.tsv 的文件,并使用了制表符(\t)作为分隔符。

使用 DBD::CSV 模块读取 CSV 文件

如果你需要把 CSV 文件看作是一个数据库表格,则可以使用 DBD::CSV 模块来读取数据。DBD::CSV 是一个基于 DBI(Database Independent Interface,数据库独立接口)的模块,提供了一种类似于 SQL 的方式来读取 CSV 文件。

以下是一个例子:

use DBI;

my $dbh = DBI->connect("dbi:CSV:", undef, undef, {
    f_dir => ".",        # CSV 文件所在的目录
    f_ext => ".csv",     # CSV 文件的扩展名
    f_encoding => "utf8", # CSV 文件的编码
    csv_eol => "\n",     # CSV 文件的行终止符
    RaiseError => 1,     # 如果出错,立即抛出异常
});

my $sth = $dbh->prepare("SELECT * FROM data");
$sth->execute();
while (my $row = $sth->fetchrow_arrayref()) {
    print join(",", @$row), "\n";
}

$sth->finish();
$dbh->disconnect();

上面的代码通过 DBI->connect 连接到了一个 CSV 数据库。f_dir 参数指定了 CSV 文件所在的目录,f_ext 参数指定了 CSV 文件的扩展名,f_encoding 参数指定了 CSV 文件的编码,csv_eol 参数指定了 CSV 文件的行终止符。然后通过 $dbh->prepare 准备了一条 SQL 查询语句,并通过 $sth->execute 执行查询。最后循环读取查询的结果,并打印出来。最后调用 $sth->finish() 关闭查询,并通过 $dbh->disconnect() 关闭数据库连接。

需要注意的是,DBD::CSV 是读取 CSV 文件的一种方式,但它并没有真正将 CSV 文件转换为数据库,因此不能进行一些数据库特有的操作,例如添加、修改和删除数据。