[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】:很高兴了解Perl 和DBI 驱动程序编程。但在您的特定情况下,您可以使用 MySQL 命令直接从文件加载数据。
Loading Data into a Table
有时它比第一眼看上去要容易得多。
【讨论】:
以上是关于[Perl] 在 perl 5.10 中读取带分隔符的文本文件并插入到 mysql 表中的主要内容,如果未能解决你的问题,请参考以下文章
Perl 5.10 - POSIX 信号被忽略,除非在 sleep() 调用期间收到?