2010-04-22 45 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

相關問題