[Perl] 在 perl 5.10 中读取带分隔符的文本文件并插入到 mysql 表中

Posted

技术标签:

【中文标题】[Perl] 在 perl 5.10 中读取带分隔符的文本文件并插入到 mysql 表中【英文标题】:[Perl]read text file with delimiter and insert into mysql table in perl 5.10 【发布时间】:2020-03-16 19:22:05 【问题描述】:

我有文本文件(employeedata.txt),其值如下:

ABC#VVV#JHY#ABC#VVV#JHY#ABC#VVV#JHY#ABC#VVV BBN#NJU#NULL#ABC#VVV#JHY#ABC#VVV#JHY#ABC#OLJ ABC#BYR#MPL#ABC#VVV#JHY#ABC#TGB#JHY#ABC#NULL NMP#JDC#NULL#ABC#VVV#JHY#ABC#XCD#JHY#ABC#NULL UJK#SAB#NULL#ABC#VVV#JHY#ABC#NBG#JHY#ABC#MPL

我的文本文件包含 5,000 行,我有一个名为 Employee 的表,其值如下:

id|EmployeLastName|EmployeFirstName|EmployeeAddress

在我的文件文本中,在每一行中,EmployeLastName 在第一个位置,EmployeFirstName 在第四个位置,EmployeeAddress 在最后一个位置

例子:

EmployeLastName#VVV#JHY#EmployeFirstName#VVV#JHY#ABC#VVV#JHY#ABC#EmployeeAddress 

现在我想使用 perl 5.10 逐行读取文本文件并插入表 Employee

我是 perl 的新手。怎么办?

【问题讨论】:

首先你需要 perl 和 mysql 见 perltutorial.org/perl-dbi 然后你需要 mysql 脚本 ***.com/questions/13579810/… 为什么不用LOAD DATA INFILE 而不是perl 【参考方案1】:

您需要阅读DBI 驱动程序以掌握下面提供的代码 - 最好花时间使用 DB。

注意:在这段代码中,我从内部块 __DATA__

读取数据
use strict;
use warnings;

use Data::Dumper;
use DBI;

my $debug = 0;

my @fields = qw(id last first address); # Field names in Database
my(%record,$rv);

my $hostname = 'db_server_1';           # Database server name
my $database = 'db_employees';          # Database name
my $table    = 'db_table';              # Table name
my $port     = '3306';                  # Database port [default]

# Define DSN
my $dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";
# Connect to Database
my $dbh = DBI->connect($dsn, $user, $password, RaiseError => 1);
# Define query
my $stq = qq(INSERT INTO $table (id,last,first,address) VALUES(?,?,?,?););
# Prepare query
my $sth = $dbh->prepare($stq);

$dbh->begin_work();                     # Ok, we will do insert in one transaction

my $skip = <DATA>;                      # We skip header in data block

while( <DATA> ) 
    @record@fields = split /#/;       # Fill the hash with record data

    print Dumper(\%row) if $debug;      # Look at hash in debug mode

    $rv = $sth->execute(@record@fields);  # Execute query with data

    print $DBI::errstr if $rv < 0;      # If error lets see ERROR message 


$dbh->commit();                         # Commit the transaction
$dbh->disconnect();                     # Disconnect from DataBase


__DATA__
id#EmployeLastName#EmployeFirstName#EmployeeAddress
1#Alexander#Makedonsky#267 Mozarella st., Pizza, Italy
2#Vladimir#Lenin#12 Glinka st., Moscow, Italy
3#Donald#Trump#765 Tower ave., Florida, USA
4#Angela#Merkel#789 Schulstrafe st., Berlin, Germany

您可以使用以下代码从文件中读取数据

use strict;
use warnings;

my $debug = 1;

my @fields = qw(id last first address); # Field names in Database
my(%record);

my $filename = shift
    or die "Provide filename on command line";

open DATA, "< $filename"
     or die "Could not open $filename";

while( <DATA> ) 
   @record@fields = split /#/;

   print Dumper(\%record) if $debug;


close DATA;

由于您对Perl 编程非常陌生,那么您可能应该从Learning Perl 开始,然后继续Programming Perl,当您遇到麻烦 时访问Perl Cookbook如果你决定深入数据库编程Programming the Perl DBI

【讨论】:

注意:如果您的表具有规范 uniq 的字段,您将在重复记录插入时出错。您需要阅读数据库表创建dev.mysql.com/doc/refman/5.5/en/create-table.html(请记住,MySQL 版本之间可能存在差异——查看您的版本的文档以避免混淆)【参考方案2】:

很高兴了解PerlDBI 驱动程序编程。但在您的特定情况下,您可以使用 MySQL 命令直接从文件加载数据。

Loading Data into a Table

有时它比第一眼看上去要容易得多。

【讨论】:

以上是关于[Perl] 在 perl 5.10 中读取带分隔符的文本文件并插入到 mysql 表中的主要内容,如果未能解决你的问题,请参考以下文章

Perl 5.10+ 中词法 $_ 的优缺点

Perl 5.10 是不是把原型弄乱了?

perl 5.8 和 5.10 之间的区别 [关闭]

Perl 5.10 - POSIX 信号被忽略,除非在 sleep() 调用期间收到?

我可以确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行吗?

高效 pre-perl-5.10 等效于 pack("Q>")