2010-07-21 44 views
1

我必须解析一个文件并将其存储在一个表中。我被要求使用散列来实现这一点。给我简单的方法来做到这一点,只有在Perl中。如何解析此文件并将其存储在表中?

----------------------------------------------------------------------- 
L1234| Archana20 | 2010-02-12 17:41:01 -0700 (Mon, 19 Apr 2010) | 1 line 
PD:21534/lserve<->Progress good 
------------------------------------------------------------------------ 
L1235 | Archana20 | 2010-04-12 12:54:41 -0700 (Fri, 16 Apr 2010) | 1 line 
PD:21534/Module<->Dir,requires completion 
------------------------------------------------------------------------ 
L1236 | Archana20 | 2010-02-12 17:39:43 -0700 (Wed, 14 Apr 2010) | 1 line 
PD:21534/General Page problem fixed 
------------------------------------------------------------------------ 
L1237 | Archana20 | 2010-03-13 07:29:53 -0700 (Tue, 13 Apr 2010) | 1 line 
gTr:SLC-163/immediate fix required 
------------------------------------------------------------------------ 
L1238 | Archana20 | 2010-02-12 13:00:44 -0700 (Mon, 12 Apr 2010) | 1 line 
PD:21534/Loc Information Page 
------------------------------------------------------------------------ 

我想读这个文件,我想执行一个拆分或任何提取以下字段的表:

  • L启动ID应该是在第一场表
  • Archana20必须在第二场
  • 时间戳必须在第三字段
  • PD必须在第四音响场
  • 类型(前/内容必须在最后一个字段)

我的问题是:

  1. 如何忽略该文件中的--------…(分割线)?
  2. 如何提取以上?
  3. 如何拆分文件有两个分隔符(|/)?
  4. 如何使用散列来实现它,需要什么?

请提供一些简单的方法,以便我能够理解,因为我是Perl的初学者。

+1

桑德亚,欢迎堆栈溢出。我编辑了你的问题的格式,如果你不想要这个,你可以撤消它。请阅读[编辑帮助](http://stackoverflow.com/editing-help),了解如何在将来在本网站上正确设置问题和答案。 – daxim 2010-07-21 10:07:52

+3

因为这不是一个家庭作业问题,而且看起来比较复杂,所以你必须先试一试。我会发布一些代码,至少会显示一些尝试。 – xenoterracide 2010-07-21 10:17:11

+0

这不是一个家庭作业...意味着这将是一个开始评估我在perl .... :( – Sandhya 2010-07-21 10:37:23

回答

1

当你说This is not a homework...to mean this will be a start to assess me in perl我假设你的意思是这也许是你在新工作或某事上的第一项任务,在这种情况下,如果我们只是给你答案,它实际上会伤害你,因为他们会假设你比你更了解Perl。

但是,我会指出你正确的方向。

答:不要使用split,请使用正则表达式。你可以通过谷歌搜索“perl regex”来了解它们。 B. Google“perl hash”了解perl哈希。第一个结果非常好。

我们您的问题:

  1. 正则表达式会帮助你忽略行你不想
  2. 与提取项目正则表达式。查找“捕获变量”
  3. 不要分割,使用正则表达式
  4. 请参见上面的B点。
+2

请加上尊重,但我认为正则表达式比在'|'上先分割'/'然后再在'/'上分割最后一个字段要困难得多和容易出错' – Telemachus 2010-07-21 11:01:40

2

我的问题是:

  1. 如何忽略-------- ...(分割线)在这个文件?
  2. 如何提取以上?
  3. 如何拆分文件有两个分隔符(|,/)?
  4. 如何使用散列来实现它,需要什么?
  1. 你可能会通过在一个循环中通过行的文件行工作。看看perldoc -f next。在这种情况下,您可以使用正则表达式或更简单的匹配,以确保您只跳过适当的行。
  2. 你需要首先分割,然后根据需要处理每个字段,我猜测。
  3. 在主分隔符上分割(看起来像是'|' - 稍后会有更多内容),然后将最后一个字段分割为次分隔符。
  4. 我不确定你是否问你是否需要散列。如果是这样,你需要选择哪个项目将提供最佳的(唯一的)一组密钥。由于我们不知道你的数据,所以我们不能为你做这件事,但第一个领域(一目了然)看起来是正确的。至于如何将这样的东西变成更复杂的数据结构,最终你会想看看perldoc perldsc,尽管它现在可能只会让你感到困惑。

另一件事,上面的数据看起来像在第一行中有一个半重要的错字。仅在该行中,第一个字段与其分隔符之间没有空格。在其他地方它是'| ”。我提到这只是因为它可以为split。我几乎编辑了这个,但也许数据本身是不规则的,但我怀疑它。我不知道你对Perl有多少初学者,但是如果你对它完全陌生,你应该考虑一本书(在线教程差别很大,许多过时了)。一本相当不错的入门书籍可以在线免费获取:Beginning Perl。另一个不错的选择是Learning PerlIntermediate Perl(他们真的走在一起)。

1

如果这个文件是基于行的,那么你可以在while循环中逐行读取。然后跳过那些没有格式化的行。

之后,您可以使用正则表达式,如其他答案中所示。我会用它来分割它并获得一个数组,并为记录构建一个列表哈希。在之后(或之前)通过修剪空格等来清理每条记录。如果使用正则表达式,则使用捕获表达式以这种方式添加到列表中。随你便。

散列键是第一列,该列表包含其他所有内容。如果你只是做一个直接插入,你可以拿出一个列表清单,然后把所有内容都放进去。

散列的关键将允许您查看特定记录以进行快速查找。但如果你不需要这个,那么一个数组就可以。

-2

你可以试试这个,

点需要知道:

  1. 一行
  2. 读取文件中的行通过使用正则表达式,删除 '----' 行。
  3. 之后使用拆分函数来填充数组的哈希值。

    #!/usr/bin/perl 
        use strict; 
        use warning; 
        my $test_file = 'test.txt'; 
        open(IN, '<' ,"$test_file") or die $!; 
        my (%seen, $id, $name, $timestamp, $PD, $type); 
        while(<IN>){ 
         chomp; 
         my $line = $_; 
         if($line =~ m/^-/){ #removing '---' lines 
         # print "$line:hello\n"; 
         }else{ 
         if ($line =~ /\|/){ 
          ($id , $name, $timestamp) = split /\|/, $line, 4; 
         } else{ 
         ($PD, $type) = split /\//, $line , 3; 
         } 
         $seen{$id}= [$name, $timestamp, $PD, $type]; //use Hashes of array 
         } 
        } 
        for my $test(sort keys %seen){ 
         my $test1 = $seen{$test}; 
         print "$test:@{$test1}\n"; 
        } 
        close(IN); 
    
+0

请使用词法文件句柄和open的三参数形式。小马和彩虹快乐 – Telemachus 2010-07-21 12:04:50

+0

我想很长一段时间,这... ...不起眼......感谢吨立即解决 – Sandhya 2010-07-21 13:03:22

+0

-0.4各种不良风格(这将圆b自己达到0),但是当他需要阅读一些关于钓鱼的书籍时,给人一条鱼的比例为-0.4。 – Ether 2010-07-21 14:42:23