2010-04-22 99 views
3

声明:我是perl脚本编程的新手,这部分是学习练习(但仍然是工作项目)。另外,我对shell脚本有更强的把握,所以我的示例可能会以这种思维模式进行格式化(但我想用perl创建它们)。对不起提前为我的冗长,我要确保我在获得跨越使用Perl解析文件并将特定值插入到数据库中

我有一个文本文件(参考指南)我的观点至少稍微清楚,是一个Word文档转换为文本,然后从Windows交换在Notepad ++中转换为UNIX格式。该文件是统一的,文件的每个部分都有相同的字段/格式/表格。

我打算做的基本方法是抓住每个部分,用唯一的批处理作业名称作为键,并将所有值放入数据库(或者可能只是一个excel文件),以便可以搜索所有字段/为每个工作编辑比在word文件中更容易,并且稍后可能创建一个web界面。

所以我想要做的是做这样的事情抓住每个部分:
sed -n '/job_name_1_regex/,/job_name_2_regex/' file.txt - 怎么会变成这样一个Perl脚本中被格式化?
(抢在总的部分,然后从那里再打破它)

要阅读脚本文件我有open FORMAT_FILE, 'test_format.txt';然后用foreach $line (<FORMAT_FILE>)解析由行的文件行。 - 有没有更好的方法?

我的下一个问题是,由于我从表一个Word文档,它看起来转化,如:

Table Heading 1  Table Heading 2 
Heading 1/Value 1 Heading 2/Value 1 
Heading 1/Value 2 Heading 2/Value 2

但文本文件,它看起来像:

Table Heading 1 
Table Heading 2
Heading 1/Value 1
Heading 1/Value 2
Heading 2/Value 1
Heading 2/Value 2

所以我想将“标题1”和“标题2”作为列名称,然后将相应的值放在那里。我只是不确定如何从文本文件中获取与标题相关的值。标题1的值始终是标题1加2的行号(标题1,标题2,标题1的值)。我知道这可以很容易地在awk/sed中完成,只是不知道如何解决里面的 perl脚本。

---编辑---
为此,我想在做一个数组类似的:
my @heading1 = ($value1, $value2, etc.)
my @heading2 = ($value1, $value2, etc.)

我只需要能够正确的价值观和标题关联在一起。因此,标题1 = 标题2后面的行(其值开始)。 就像说(壳):
x=$(cat file.txt | grep -n "Heading 1" | cut -d":" -f1) - 得到行“标题1”是在文件中
((x = x+2)) - 增加2到线(其中的值将开始)
sed -n "$x,$last_line_of_values p" file.txt - 从文件打印值。从那里开始,到最后一个行TXT(我会明白这一点,在一些点在此之前)

这是超级黑客的时刻在一起,试图阐述什么,我想做的事情。 ..let我知道,如果它清除它一点点...
---/---编辑

后,我有所有的正确的价值观和这样的,它连接到一个数据库可能是一个问题,好吧,我还没有开始考虑perl与数据库交互的方式。

对不起,如果这是一个有点scatterbrained ...它仍然没有完全形成在我的脑海。

回答

2

在这篇文章中有几件事情。首先,基本的 “最佳实践”:

  1. 利用现代的Perl。与

    use strict; use warnings;

  2. 启动脚本不使用全局文件句柄,使用词法文件句柄(在一个变量声明它们)。

  3. 总是选中“打开”返回值。

    open my $file, "/some/file" or die "can't open file : $!"

然后,大约模式匹配:我不明白你的例子在所有,但我想你想要的东西,如:

foreach my $line (<$file>) { 
    if ($line =~ /regexp1/) { 
    # do something... 
    } 

} 

编辑:关于表,我猜想最好的事情是建立两个数组,每列一个。 如果我在读取文件时正确理解,则需要拆分该行,并将@部分放入@ col1数组中,将第二部分放入@ col2数组中。明确和简单的方法是使用两个临时变量:

my ($val1, $val2) = split /\s+/, $line; 
push @col1, $val1; 
push @col2, $val2; 
+0

感谢WAZ,我更新了一篇关于试图更好地解释它的表。 – Sean 2010-04-22 17:40:10

3

http://perlmeme.org/tutorials/connect_to_db.html

#!/usr/bin/perl 
use strict; 
use warnings; 
use DBI; 

my $driver = "mysql"; # Database driver type 
my $database = "test"; # Database name 
my $user = "";   # Database user name 
my $password = "";  # Database user password 

my $dbh = DBI->connect(
    "DBI:$driver:$database", 
    $user, $password, 
    { 
     RaiseError => 1, 
     PrintError => 1, 
    } 
) or die $DBI::errstr; 

my $sth = $dbh->prepare(" 
     INSERT INTO test 
        (col1, col2) 
      VALUES (?, ?) 
    ") or die $dbh->errstr; 

my $intable = 0; 
open my $file, "file.txt" or die "can't open file $!"; 
while (<$file>) { 
    if (/job_name_1_regex/../job_name_2_regex/) { # job 1 section 
    $intable = 1 if /Table Heading 1/; # table start 
    if ($intable) { 
     my $next_line = <$file>; # heading 2 line 
     chomp; chomp $next_line; 
     $sth->execute($_, $next_line) or die $dbh->errstr; 
    } 
    } 
} 
close $file or die "can't close file $!"; 
$dbh->disconnect; 
+0

太棒了,那个数据库连接过程更清晰了......你能解释一下什么是'chomp' chomp $ next_line;'确切地说,只是试图很好地处理所有事情,以及为什么某些事情已经完成。 – Sean 2010-04-22 17:49:32

+0

@Sean:'chomp'从字符串中删除尾随的$ /'(换行符)(如果没有给出,那么它在'$ _'变量上起作用)。 – jfs 2010-04-22 18:03:33

相关问题