如何解析此文件并将其存储在表中?

时间:2010-07-21 09:40:52

标签: perl parsing

我必须解析一个文件并将其存储在一个表中。我被要求使用哈希来实现这一点。给我一些简单的方法,只在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. 如何使用哈希实现它以及需要什么呢?
  5. 请提供一些简单的方法,以便我能够理解,因为我是Perl的初学者。

4 个答案:

答案 0 :(得分:2)

  

我的问题是:

     
      
  1. 如何忽略此文件中的-------- ...(分隔线)?
  2.   
  3. 如何提取以上内容?
  4.   
  5. 如何拆分,因为文件有两个分隔符(|,/)?
  6.   
  7. 如何使用哈希实现它以及需要什么呢?
  8.   
  1. 您可能会在循环中逐行处理文件。看看perldoc -f next。在这种情况下,您可以使用正则表达式或更简单的匹配,以确保只跳过适当的行。
  2. 您需要首先拆分,然后根据需要处理每个字段,我猜。
  3. 拆分主分隔符(似乎是'|' - 在一分钟内更多),然后在其辅助分隔符上拆分最后一个字段。
  4. 我不确定你是否在询问是否需要哈希。如果是这样,您需要选择哪个项目将提供最佳(唯一)键。我们不能为您做到这一点,因为我们不知道您的数据,但第一个字段(一目了然)看起来是正确的。至于如何将这样的东西变成更复杂的数据结构,你最终会想看perldoc perldsc,尽管它现在可能只会让你感到困惑。
  5. 另外一件事,上面的数据看起来在第一行中有一个半重要的拼写错误。仅在该行中,第一个字段与其分隔符之间没有空格。其他任何地方都是'| ”。我之所以提到这一点,只是因为它对split很重要。我几乎编辑了这个,但也许数据本身是不规则的,但我怀疑它。

    我不知道你对Perl的初学者有多少,但如果你是一个全新的,你应该考虑一本书(在线教程差别很大,很多都非常过时)。一本相当不错的入门书可以在线免费获取:Beginning Perl。另一个不错的选择是Learning PerlIntermediate Perl(它们真的在一起)。

答案 1 :(得分:1)

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

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

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

现在回答你的问题:

  1. 正则表达式将帮助您忽略您不想要的行
  2. 带有提取项的正则表达式。查找“捕获变量”
  3. 请勿拆分,请使用正则表达式
  4. 见上文B点。

答案 2 :(得分:1)

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

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

哈希键是第一列,列表包含其他所有内容。如果您只是直接插入,您可以使用列表列表,而只是将所有内容放入其中。

哈希的密钥允许您查看特定记录以进行快速查找。但如果你不需要那个,那么数组就可以了。

答案 3 :(得分:-1)

你可以试试这个,

要点需要知道:

  1. 逐行阅读文件
  2. 使用正则表达式,删除“----”行。
  3. 之后使用split函数填充数组的Hashes。

        #!/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);