0

600を超えるtxtファイルをMySQLにインポートし、perlと次のコードを使用しようとしていますが、機能していないようです。接続してから切断するという意味では、各ファイルを開いて指示どおりに処理するようには見えないため、インポートテーブルは空のままです。ディレクトリが存在するので、コードに明らかなエラーがない限り、何が間違っているのかわかりません。perlスクリプトを実行してもエラーメッセージは表示されません。各ファイルには、1行に1つのレコードがあり、レコードの終わりを示す\n文字が付いています。私は誰かが助けてくれることを願っています、この小さな問題は当惑していて、それがうまくいかない理由についての明白な理由を私は見ることができません。

use strict;
use warnings;
use DBI;

# Set datasource
my $dsn = "DBI:mysql:host=somehost;database=somedb"
        . ";port=someport";

# Connect to database 
my $dbh = DBI->connect($dsn,"someuser","somepassword");
print "Status: Connected to MySQL.\n";

my $dir = "t:\\some directory";

opendir (DIR, $dir) or die "Unable to open directory";
my @files = grep /\.txt/, readdir(DIR);
closedir(DIR);

foreach my $file (@files) {
open(FH, '<', "$dir\\$file") or die "Unable to open $file - $!\n";
while (<FH>){ 
    my $data = split (/\n$/);
    my $insert = $dbh->prepare('INSERT INTO sometable 
            (TEXTDATA,SOURCEFILE) 
        VALUES (?,?)') or die "Prepare failed: " . $dbh->errstr(); 
$insert->execute($data,$file) or die "Execute failed: " . $dbh->errstr(); 
}
close(FH);
}
print "Status: Processing of complete.\n";

# Disconnect from the database
$dbh->disconnect ();
print "Status: Disconnected from MySQL.";
4

1 に答える 1

0

あなたがしていることのいくつかはかなり時代遅れです。

  • パス区切り文字には、バックスラッシュではなくスラッシュを使用してください。Perlは正しいことをします。
  • 反復ごとに準備されている場合、prepareステートメントはあまり効果がありません。ループの外側で一度準備する必要があります。
  • 新しい行は、デフォルトではレコード区切り文字です。したがって、splitを使用してデータの行を変数に格納するのではなく、その行を変数に割り当てるだけです。
  • 指定されたパスで実際にファイルが見つかったかどうかも確認していません。

私は次のように修正しました:

use v5.12;
use strict;
use warnings;
use DBI;

# Set datasource
my $dsn = "DBI:mysql:host=somehost;database=somedb;port=someport";

# Connect to database 
my $dbh = DBI->connect($dsn,"someuser","somepassword")
    or die "Couldn't connect to MySQL server: $!";
say "Status: Connected to MySQL.";

my $source_dir = "t:/some/directory";

# Store the handle in a variable.
opendir my $dirh, $source_dir or die "Unable to open directory: $!";
my @files = grep /\.txt$/i, readdir $dirh;
closedir $dirh;

# Stop script if there aren't any files in the list
die "No files found in $source_dir" unless @files;

# You can comment out the following two lines
# once you're sure things are working
say 'Importing data from:';
say for @files;

my $insert = $dbh->prepare('INSERT INTO sometable (TEXTDATA,SOURCEFILE) '
                           . 'VALUES (?,?)')
                           or die "Prepare failed: " . $dbh->errstr(); 
for my $file (@files) {
    say "Processing $source_dir/$file";
    open my $fh, '<', "$source_dir/$file"
        or die "Unable to open $source_dir/$file: $!\n";

    # Don't use split. Just assign the line.
    while (my $line = <$fh>) {
       $insert->execute($line,$file)
           or die "Execute failed: " . $dbh->errstr(); 
    }

    close $fh;
}
print "Status: Processing of complete.\n";
于 2012-11-29T12:35:19.110 に答える