将文本文件加载到MySQL - 跳过第一行

时间:2016-12-07 03:06:22

标签: mysql perl

我正在将文本文件的内容加载到MySQL数据库中。我已经正确加载了表格,但我还没有能够跳过第一行,这只是表格的标题。

这里是我编写的代码,考虑了该线程的所有注释。我添加了一行

if($. == 1) { 

我打开文件后跳过文本文件的标题,但它似乎仍无法正常工作。

感谢大家的耐心等待。

有什么建议吗?

#!/usr/bin/perl -w

use DBI;
use strict;
use Data::Dumper;

my $user = shift @ARGV or die $!;
my $password = shift @ARGV or die $!;
my $database = shift @ARGV or die $!;
my $recipient_ewes = shift @ARGV or die $!;


my $dbh = DBI->connect("DBI:mysql:$database:localhost",
                   $user,
                   $password,
                   {RaiseError => 1}
                   );



open (FILE, "rid.txt") or die $!;

while (<FILE>) {

    if($. == 1) {
        next;
    }

    my $GID;
    my $RID;
    my $number;

    my $line = $_;
    chomp $line;

    my @array = split("\t",$line);

    if (scalar(@array)==4){
        $RID = $array[0];
        $GID = $array[2];
        $number = $array[3];

        my $sth = $dbh-> prepare (qq{insert into $recipient_ewes (GID, RID,     numbertransferred) values ("$GID", "$RID", "$number")});

        $sth -> execute ();
        $sth -> finish ();
    }
}

$dbh->disconnt ();
exit;
close FILE;

输入文件是:

Recipient ID            Round            Group #            # of transfers  
6507                      1                 2                     4  
5101                      1                 4                     4  
5007                      1                 5                     3  
6535                      2                 6                     4  
6510                      2                 7                     4  

2 个答案:

答案 0 :(得分:4)

@Matt Jacob评论将解决您的问题。

$.给出文件的当前行号。 Here about next

while (<$fh>)
{
   if($. == 1)  #@Matt Jacob written in one line
   {
      next;
   }

   # do your stuff

}
  
    

始终在程序顶部添加use warnings;use strict;

         

对文件句柄使用三个参数。

  

然后不要将$1 $2 $3用作变量名称,这些名称将用于正则表达式分组。

最后,以下将有助于解决您的问题

open my $fh, "<", "Filename.txt";
<$fh>; #Here removing the first line

while (my $line = <$fh>)
{
   chomp $line;
   ..
   do you stuff..

答案 1 :(得分:0)

忽略数据库内容,这里是如何在阅读文件时跳过第一行:

use strict;
use warnings;

while (<DATA>) {
    next if $. == 1;
    my ($RID, undef, $GID, $number) = split;
    print join(', ', $RID, $GID, $number), "\n";
}

__DATA__
Recipient ID            Round            Group #            # of transfers
6507                      1                 2                     4
5101                      1                 4                     4
5007                      1                 5                     3
6535                      2                 6                     4
6510                      2                 7                     4

输出:

6507, 2, 4
5101, 4, 4
5007, 5, 3
6535, 6, 4
6510, 7, 4

注意:

  • $.是一个特殊变量,它引用最后访问的文件句柄的当前行号。
  • split在省略模式或单个空格字符时具有特殊的空白模式。