2015-11-28 37 views
-1

我有一個將Jmeter JTL FILE轉換爲CSV的代碼,但是當我運行代碼時,出現以下錯誤:IndexError:列表行超出範圍Python 2.7 IndexError:列表索引超出範圍,轉換文件

這是代碼

import sys 
import re 
import datetime 
import time 

startTime = time.time() 
cnt = 0 
cnt2 = 0 
failCnt = 0 
reCompile = re.compile("\s([^\s]*?)=\"(.*?)\"") 
delimiterCharacterOut = "," 

def writeCSVLine(line): 

     x = reCompile.findall(line) 
     a = dict((row[0], row[1]) for row in x) 

     try: 
      a['ts1'] = str(int(int(a['ts'])/1000)) 
      x = str(datetime.datetime.fromtimestamp(float(a['ts1'])))[0:19] 
      b = a['ts'] + ",\"" + x + "\"," + a['t'] + "," + a['lt'] + ",\"" + a['s'] + "\",\"" + a['lb'] + "\"," + a['rc'] + ",\"" + a['rm'] + "\",\"" + a['tn'] + "\",\"" + a['dt'] + "\"," + a['by'] + ",\"" + a['sc'] + "\"," + a['ec'] + ",\"" + a['ng'] + "\"," + a['na'] + ",\"" + a['hn'] + "\"," + a['in'] + "\n" 
     except: 
     return -1 
     o.write(b) 
     return 1 

print "Splitting JTL file" 

try: 

    runArgv = sys.argv   #Save the command line 
    jtlInfile = str(sys.argv[1]) #Name of JTL input file 
    cvsOutfile = str(sys.argv[2]) # Name of CVS output file 
    reFilter = str(sys.argv[3]) # Filter the labels (lb) for the filter 

except: 
     print "Error: Input format: <input file> <output file> <Filter by regular expression>" 
     raise 

try: 

    f = open(jtlInfile, "r") 
    o = open(cvsOutfile, "w") 

except: 

    raise 

print "Filtering on regular expression : " + reFilter 
cmpFilter = re.compile(reFilter) 
# o.write("timestamp" + ",\""+ "datetime" + "\n") 
o.write("timeStamp" + ",\"" + "datetime" + "\"," + "elapsed" + "," + "Latency" + ",\"" + "success" + "\",\"" + "label" + "\"," + "responseCode" + ",\"" + "responseMessage" + "\",\"" + "threadName"+ "\",\"" + "dataType" + "\"," + "bytes" + ",\"" + "SampleCount" + "\"," + "ErrorCount" + ",\"" + "grpThreads" + "\"," + "allThreads" + ",\"" + "Hostname" + "\"," + "IdleTime" + "\n") 

for line in f: 

    try: 
      if cmpFilter.search(line): 
       returnVal = writeCSVLine(line) 
       if returnVal<0: 
         failCnt += 1 
       else: 
        cnt2 += 1 
    except: 
      print 'Error in line : ', cnt, line 
      raise 
    cnt += 1 

endTime = time.time() 
print "Time taken : ", str(endTime-startTime) 
print "Lines processed : ", cnt 
print "Lines that passed the filter : ", cnt2 
print "Lines skipped (error?) : ", failCnt 
f.close() 
o.close() 

Log de CMD

基部教程是:http://balasoftwaretesting.blogspot.com/2012/03/converting-jmeter-jtl-file-to-csv-file.html?spref=bl

+0

請讓我們知道錯誤在哪裏。有一個更簡單的例子,顯示錯誤? – tdelaney

+0

哦,等等......是在那個JPEG中。把錯誤置於問題中可以提供幫助。你的問題是'jtlInfile = str(sys.argv [1])''。這意味着你沒有用期望的參數調用程序。 – tdelaney

回答

0

錯誤展望腳本,你需要傳遞3個命令行參數:

  1. 源JTL文件
  2. 目標CSV文件
  3. 正則表達式濾波器

所以,你需要執行類似的腳本:

JtltoCsv_Jmeter.py example.jtl example.csv "(.*)" 

也有切換JMeter的結果輸出格式爲CSV,爲了做到這一點使用以下步驟之一選項:

  1. 添加jmeter.save.saveservice.output_format=csvuser.properties文件
  2. (根據你安裝Jmeter的/ bin文件夾中的生活)傳遞屬性值經由-J命令行參數爲:

    jmeter -Jjmeter.save.saveservice.output_format=csv 
    

對JMeter的性質和傳球的方式的詳細信息參見Apache JMeter Properties Customization Guide,設置並覆蓋它們。

0

sys.argv文檔,sys.argv是傳遞給Python腳本的命令行參數的列表。

您的命令行日誌顯示您運行的是python JtltoCsv_Jmeter.py,這將導致sys.argv的空列表。本教程提供了一個JTL文件作爲參數傳遞給JtltoCsv_Jmeter.py

JtltoCsv_Jmeter.py C:\JtlToCsvConverter\input\sample.jtl 

所以看起來也許在複製/粘貼:)

+0

除了'argv'不會爲空...'argv [0]'將有腳本名稱,OP需要3個參數。 – tdelaney

+0

但我使用Runme.bat –

相關問題