сортировка в рубине по второму полю - PullRequest
0 голосов
/ 25 марта 2012

Мне очень нравится Ruby, но я не могу делать некоторые вещи в Perl, поэтому, пожалуйста, помогите

  1. Как можно сопоставить ту или иную запись в строке

    в Perl:

    while ( <$HAN> ) {
      next unless /**$TAB_11|$TAB_35**/;
    

    в рубине:

    f = File.open(li, "r:windows-1251")
    if f.each do |line|  
      next unless line.include? (tag_11 && tag_35)
    

    Я пытался или, ||, и - ни один из них не работал так, как в случае с Perl, - как я могу это сделать?

  2. Я пытаюсь отсортировать массив - но он не сортируется должным образом - мне нужно отсортировать его по второму полю -> дата / время

    unless line.include? (tag_466 && tag_1004)   
    a=[]
    a.push "******************************** 1.Message Received On S Side ********************************",
     line,"\n" if line =~ /#{MAT_1}/   #li.console_blink, --to check source 
    a.push "******************************** 3.Message received ES side ********************************",
     line,"\n" if line =~ /#{MAT_3}/
    a.push "******************************** 4.Ticket has been created ********************************",
     line,"\n" if line =~ /#{MAT_4}/
    a.sort!
    puts a end`
    

    результаты

    ******************************* 2.Message Processed On SGW side ********************************
    20120210 08:03:55,872 DEBUG IceTradeMessageMapper -  --------- Processing  Trade [1311883] --------- 
    
    ******************************** 1.Message Received On SGW Side ********************************
    20120210 08:04:05,404 DEBUG MQReceiver - Receive message "<FIXML><TrdCaptRpt RptID="763"
    

Ответы [ 2 ]

0 голосов
/ 25 марта 2012

1) Вы можете использовать IO :: foreach в качестве удобного итератора для файла, используйте оператор сопоставления для проверки регулярных выражений, почти как в perl.

IO.foreach(li) do |line|
  next unless line =~ /#{tag_11}|#{tag_35}/
  ...
end

2) Вы используете Array # push с тремя аргументами: строки, заполненные длинной звездочкой, лексическая переменная var и литерал "\ n".Кажется, вы намереваетесь сделать это тройкой, которую можно рассматривать как одну запись.push просто добавит их в массив, возможно, вы действительно хотите, чтобы они были подмассивом:

a.push [ '**** something ****', line, "\n" ]

Затем вы можете отсортировать по второму элементу с помощью

a.sort_by! {|e| e[1] }

Если вына самом деле нужен один плоский массив, вы можете нажать, как вы сделали, и использовать Enumerable # each_slice , чтобы сгруппировать по три:

a.each_slice(3).sort_by{|e| e[1]}.flatten(1)

ПОЗЖЕ: вот то, что я думаю, вы проситесортировка:

irb(main):001:0> a=[]
irb(main):002:0> a.push "** 1.mumble","20120210 08:04:05,404 DEBUG","\n"
irb(main):003:0> a.push "** 3.grumble","20120210 08:04:00,404 DEBUG","\n"
irb(main):004:0> a.push "** 2.mutter","20120210 08:03:05,404 DEBUG","\n"
=> ["** 1.mumble", "20120210 08:04:05,404 DEBUG", "\n", "** 3.grumble", "20120210 08:04:00,404 DEBUG", "\n", "** 2.mutter", "20120210 08:03:05,404 DEBUG", "\n"]

# sort by time stamp
irb(main):005:0> puts a.each_slice(3).sort_by { |label,ts,_| ts }.flatten(1)
** 2.mutter
20120210 08:03:05,404 DEBUG

** 3.grumble
20120210 08:04:00,404 DEBUG

** 1.mumble
20120210 08:04:05,404 DEBUG

# sort by integer value of first number in the label
irb(main):006:0> puts a.each_slice(3).sort_by{ |label,ts,_| label.match(/(\d+)/)[0].to_i }.flatten(1)
** 1.mumble
20120210 08:04:05,404 DEBUG

** 2.mutter
20120210 08:03:05,404 DEBUG

** 3.grumble
20120210 08:04:00,404 DEBUG
0 голосов
/ 25 марта 2012

Re 1. Вы можете использовать Perl-подобное регулярное выражение (=~).

next unless line =~ /regular expression|other expression/;

Если вы хотите сделать это с include?, это будет

next unless line.include?(tag_11) || line.include?(tag_35)

Re 2. Я не совсем понимаю, о чем вы спрашиваете здесь, но вы, вероятно, хотите посмотреть на sort_by .

...