1

我是一个 ruby​​ 新手,他正试图读取这样的文本文件(Valgrind 模拟输出):

--------------------------------------------------------------------------------
Profile data file 'temp/gt_1024_2_16.out'
--------------------------------------------------------------------------------
I1 cache:         1024 B, 16 B, 2-way associative
D1 cache:         32768 B, 64 B, 8-way associative
LL cache:         3145728 B, 64 B, 12-way associative
Profiled target:  bash run.sh
Events recorded:  Ir I1mr ILmr Dr D1mr DLmr Dw D1mw DLmw
Events shown:     Ir I1mr ILmr Dr D1mr DLmr Dw D1mw DLmw
Event sort order: Ir I1mr ILmr Dr D1mr DLmr Dw D1mw DLmw
Thresholds:       99 0 0 0 0 0 0 0 0
Include dirs:     
User annotated:   
Auto-annotation:  off

--------------------------------------------------------------------------------
       Ir    I1mr  ILmr      Dr  D1mr  DLmr      Dw  D1mw  DLmw 
--------------------------------------------------------------------------------
1,894,017 246,981 2,448 519,124 4,691 2,792 337,817 1,846 1,672  PROGRAM TOTALS

// other data

我想提取 PROGRAM TOTALS 表并将其放入哈希中。就像是...

myHash = { :Ir => 1894017, :I1mr => 246981, ILmr => 2448, ..., DLmw => 1672 }

这样做的最佳选择是什么?CSV 课程可以帮助我吗?谢谢一堆。

我当前的代码:

file = File.open(fileName, "r")
while header = file.gets
  if header =~ /       Ir    I1mr  ILmr      Dr  D1mr  DLmr      Dw  D1mw  DLmw /
    # Found the header
    file.gets # skip the ---- line
    values = file.gets

    puts "Header: " + header
    puts "  Data: " + values
    break
  end
end

我有这个输出:

Header:        Ir    I1mr  ILmr      Dr  D1mr  DLmr      Dw  D1mw  DLmw 
  Data: 1,894,017 246,981 2,448 519,124 4,691 2,792 337,817 1,846 1,672  PROGRAM TOTALS

我怎样才能将这两个字符串加入一个哈希?

4

3 回答 3

2

看着:

NAMES_INDEX = 16 # the line number of Ir I1mr ILmr Dr ... 
NUMBERS_INDEX = 18 # the line number of 1,894,017 246,981 2,448 ...
FILE_NAME= "temp/gt_1024_2_16.out" # the file name
f = f = File.readlines(FILE_NAME)
names = f[NAMES_INDEX].split
numbers = f[NUMBERS_INDEX].split[0..-3].map{|a| a.delete(",").to_i}

h = Hash[names.zip numbers]
p h
于 2013-10-17T16:17:27.453 回答
1

我会这样写代码:

file_path, lines_with_data = 'data.txt', [16,18]
header, data = File.readlines(file_path)
                   .values_at(*lines_with_data)
                   .map{|line| line.strip.gsub(',','')
                   .split(/\s+/)}
data.map!(&:to_i)
p Hash[header.zip(data)] # => {"Ir"=>1894017, "I1mr"=>246981, "ILmr"=>2448, "Dr"=>519124, "D1mr"=>4691, "DLmr"=>2792, "Dw"=>337817, "D1mw"=>1846, "DLmw"=>1672}
于 2013-10-17T16:54:41.220 回答
1

看起来您的列名是固定的,因为您搜索它们以找到数据行。

我会这样做

data = nil

names = %w/ Ir    I1mr  ILmr      Dr  D1mr  DLmr      Dw  D1mw  DLmw /

open('E:\Perl\source\valgrind.txt', 'r') do |f|
  f.each_line do |line|
    if line =~ /PROGRAM TOTALS/
      values = line.scan(/[\d\,]+/).map { |num| num.tr(',', '').to_i  }
      data = Hash[ names.zip(values) ]
      break
    end
  end
end

p data

输出

{"Ir"=>1894017, "I1mr"=>246981, "ILmr"=>2448, "Dr"=>519124, "D1mr"=>4691, "DLmr"=>2792, "Dw"=>337817, "D1mw"=>1846, "DLmw"=>1672}
于 2013-10-17T16:48:09.933 回答