Как мне разобрать этот файл и сохранить его в таблице? - PullRequest
2 голосов
/ 21 июля 2010

Я должен проанализировать файл и сохранить его в таблице.Меня попросили использовать хеш для реализации этого.Дайте мне простые способы сделать это, только в 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, должен быть первым полем в таблице
  • Archana20 должен находиться во втором поле
  • метка времени должна находиться в третьем поле
  • PD должно быть в четвертом поле
  • Тип (содержание, предшествующее / должно быть в последнем поле)

Мои вопросы:

  1. Как игнорировать --------… (разделительную линию) в этом файле?
  2. Как извлечь приведенное выше?
  3. Как разделить, так как файл имеет два разделителя (|, /)?
  4. Как реализовать это с помощью хэша и зачем это нужно?

Пожалуйста, предоставьте несколько простых средств, чтобы я мог понять, так как яначинающий в Perl.

Ответы [ 4 ]

2 голосов
/ 21 июля 2010

Мои вопросы:

  1. Как игнорировать --------… (разделительную строку) в этом файле?
  2. Как извлечь вышеперечисленное?
  3. Как разделить, так как файл имеет два разделителя (|, /)?
  4. Как реализовать это с помощью хэша и зачем это нужно?
  1. Вероятно, вы будете построчно работать через файл. Взгляните на perldoc -f next. В этом случае вы можете использовать регулярные выражения или более простое совпадение, чтобы убедиться, что вы пропускаете только соответствующие строки.
  2. Сначала нужно разбить, а затем обрабатывать каждое поле, как мне кажется.
  3. Разделить на основной разделитель (который выглядит как '|' - подробнее об этом через минуту), а затем разделить последнее поле на его дополнительном разделителе.
  4. Я не уверен, спрашиваете ли вы, нужен ли вам хэш или нет. Если это так, вам нужно выбрать, какой элемент предоставит лучший набор (уникальных) ключей. Мы не можем сделать это для вас, так как мы не знаем ваших данных, но первое поле (на первый взгляд) выглядит правильно. Что касается того, как превратить нечто подобное в более сложную структуру данных, вам может понадобиться взглянуть на perldoc perldsc в конце концов, хотя это может только смущать вас прямо сейчас.

Еще одна вещь, ваши данные, представленные выше, выглядят так, как будто в первой строке содержится полуосущественная опечатка. Только в этой строке между первым полем и его разделителем нет пробела. Везде еще это '| ». Я упоминаю об этом только потому, что это может иметь значение для split. Я почти отредактировал это, но, возможно, сами данные нерегулярны, хотя я сомневаюсь в этом.

Я не знаю, насколько вы новичок в Perl, но если вы совершенно новичок в этом, вам следует подумать о книге (онлайн-учебники сильно различаются, и многие из них ужасно устарели). Достаточно хорошая вводная книга находится в свободном доступе в Интернете: Beginning Perl . Еще один хороший вариант: Изучение Perl и Средний Perl (они действительно идут вместе).

1 голос
/ 21 июля 2010

Если этот файл основан на строке, вы можете выполнять построчное чтение в цикле while.Затем пропустите те строки, которые не отформатированы так, как вы хотите.

После этого вы можете использовать регулярное выражение, как указано в другом ответе.Я бы использовал это, чтобы разделить его и получить массив и создать хэш списков для записи.Либо после этого (или до) очищайте каждую запись, обрезая пробелы и т. Д. Если вы используете регулярное выражение, то используйте выражения захвата, чтобы добавить в свой список таким способом.Вам решать.

Ключ хэша - это первый столбец, список содержит все остальное.Если вы просто делаете прямую вставку, вы можете уйти со списком списков и просто поместить все в него.

Ключ для хэша позволит вам просматривать определенные записи для быстрого поиска.Но если вам это не нужно, то с массивом все будет в порядке.

1 голос
/ 21 июля 2010

Когда вы говорите This is not a homework...to mean this will be a start to assess me in perl Я предполагаю, что вы имеете в виду, что это, возможно, первое задание, которое у вас есть на новой работе или чем-то еще, в этом случае кажется, что если мы просто дадим вам ответ, это на самом деле повредит вам позжебудет предполагать, что вы знаете о Perl больше, чем вы.

Однако я укажу вам правильное направление.

A.Не используйте split, используйте регулярные выражения.Вы можете узнать о них, прибегая к помощи "perl regex" B. Google "perl hash", чтобы узнать о perl хешах.Первый результат очень хороший.

Теперь к вашим вопросам:

  1. регулярные выражения помогут вам игнорировать ненужные вам строки
  2. регулярные выражения с элементами извлечения,Посмотрите на «переменные захвата»
  3. Не разбивайте, используйте регулярное выражение
  4. См. Пункт B выше.
0 голосов
/ 21 июля 2010

Вы можете попробовать это,

Очки нужно знать:

  1. читать файл построчно
  2. Используя регулярное выражение, удаляем строки ----.
  3. после этого используйте функцию split для заполнения хэшей массива.

        #!/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);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...