2017-06-26 58 views
0

我正在寫的是通過一些關鍵字後100+ .log文件搜索解析程序解析.log文件,然後,再放入不同array's的話,並在Excel列分開的話。現在我想在Access中自動排序它們,這樣我就可以處理不同的.log文件組合。我可以從我的Excel文件「複製粘貼」到Access,但效率很低並出現一些錯誤......我希望它是「自動」的。我是新來的Access和不知道如何鏈接從Python到Access,我曾嘗試這樣做,因爲我做了Excel,但這並沒有工作,並開始尋找到OBDC,但有一些問題在那裏......排序在訪問

import glob # includes 
import xlwt # includes 
from os import listdir # includes 
from os.path import isfile, join # includes 


def logfile(filename, tester, createdate,completeresponse): 
    # Arrays for strings 
    response = [] 
    message = [] 
    test = [] 
    date = [] 

    with open(filename) as filesearch: # open search file 
     filesearch = filesearch.readlines() # read file 

    for line in filesearch: 
     file = filename[39:] # extract filename [file] 
     for lines in filesearch: 
      if createdate in lines: # extract "Create Time" {date} 
       date.append(lines[15:34]) 
      if completeresponse in lines: 
       response.append(lines[19:]) 

     print('pending...') 

     i = 1 # set a number on log {i} 
     d = {} 
     for name in filename: 
      if not d.get(name, False): 
       d[name] = i 
       i += 1 

     if tester in line: 
      start = '-> ' 
      end = ':\ '              # |<----------->| 
      number = line[line.find(start)+3: line.find(end)]  #Tester -> 1631 22 F1 2E :\ BCM_APP_31381140 AJ \ Read Data By Identifier \ 
      test.append(number) # extract tester {test} 
                    #    |<-------------------------------------------- 
      text = line[line.find(end)+3:]    # Tester -> 1631 22 F1 2E :\ BCM_APP_31381140 AJ \ Read Data By Identifier \ 
      message.append(text) 

    with open('Excel.txt', 'a') as handler: # create .txt file 
     for i in range(len(message)): 
      #     A  B  C  D   E 
      handler.write(f"{file}|{date[i]}|{i}|{test[i]}|{response[i]}") 
     # A = filename B = create time C = number in file D = tester E = Complete response 

# open with 'w' to "reset" the file. 
with open('Excel.txt', 'w') as file_handler: 
    pass 
# --------------------------------------------------------------------------------- 

for filename in glob.glob(r'C:\Users\Desktop\Access\*.log'): 
    logfile(filename, 'Sending Request: Tester ->', 'Create Time:','Complete Response:','Channel') 


def if_number(s): # look if number or float 
    try: 
     float(s) 
     return True 
    except ValueError: 
     return False 
# ---------------------------------------------- 

my_path = r"C:\Users\Desktop\Access" # directory 
# search directory for .txt files 
text_files = [join(my_path, f) for f in listdir(my_path) if isfile(join(my_path, f)) and '.txt' in f] 

for text_file in text_files:  # loop and open .txt document 
    with open(text_file, 'r+') as wordlist: 
     string = [] # array ot the saved string 
     for word in wordlist: 
      string.append(word.split('|')) # put word to string array 
     column_list = zip(*string) # make list of all string 

    workbook = xlwt.Workbook() 
    worksheet = workbook.add_sheet('Tab') 
    worksheet.col(0) # construct cell 
    first_col = worksheet.col(0) 
    first_col.width = 256*50 

    second_col = worksheet.col(1) 
    second_col.width = 256*25 
    third_col = worksheet.col(2) 
    third_col.width = 256*10 
    fourth_col = worksheet.col(3) 
    fourth_col.width = 256*50 
    fifth_col = worksheet.col(4) 
    fifth_col.width = 256*100 

    i = 0 # choose column 0 = A, 3 = C etc 
    for column in column_list: 

     for item in range(len(column)): 
      value = column[item].strip() 
      if if_number(value): 

       worksheet.write(item, i, float(value)) # text/float 
      else: 
       worksheet.write(item, i, value) # number/int 
     i += 1 

print('File:', text_files, 'Done') 

workbook.save(text_file.replace('.txt', '.xls')) 

enter image description here

是否有辦法來自動「複製粘貼」指令,如果是的話會怎麼看起來像和工作?如果那是不可能完成的事情,一些建議會有很大的幫助!

編輯

謝謝,我已經做了索姆谷歌上搜索,並感謝您的幫助!但現在我得到一個錯誤...我仍然不能將信息發送到Access文件,我得到一個語法錯誤。我知道它存在,因爲我想要升級現有的文件...有沒有一個命令來「升級一個正在升級的Acces文件」?

錯誤

pyodbc.ProgrammingError: ('42S01', "[42S01] [Microsoft][ODBC Microsoft Access Driver] Table 'tblLogfile' already exists. (-1303) (SQLExecDirectW)") 

代碼

import pyodbc 


UDC = r'C:\Users\Documents\Access\UDC.accdb' 
# DSN Connection 
constr = " DSN=MS Access Database; DBQ={0};".format(UDC) 
# DRIVER connection 
constr = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};UID=admin;UserCommitSync=Yes;Threads=3;SafeTransactions=0;PageTimeout=5;MaxScanRows=8;MaxBufferSize=2048;FIL={MS Access};DriverId=25;DefaultDir=C:/USERS/DOCUMENTS/ACCESS;DBQ=C:/USERS/DOCUMENTS/ACCESS/UDC.accdb" 

# Connect to database UDC and open cursor 
db = pyodbc.connect(constr) 
cursor = db.cursor() 

sql = "SELECT * INTO [tblLogfile]" +\ 
     "FROM [Excel 8.0;HDR=YES;Database=C:/Users/Documents/Access/Excel.xls.[Tab];" 

cursor.execute(sql) 
db.commit() 

cursor.close() 
db.close() 
+0

您可以使用@ vince-west提供的答案,但是PyODBC確實是一個很好的選擇。與僅使用數據庫調用相比,整個複製粘貼到剪貼板以傳輸數據的效率非常低,如果您以前使用Excel的嘗試失敗,我懷疑您會通過此方法獲得成功。如果您在使用PyODBC時遇到困難,您可以隨時提出一個問題。 –

回答

1

首先,請注意,MS Access是一個數據庫管理系統,不是電子表格應用程序MS Excel。訪問位於關係引擎之上,並在數據和關係完整性方面保持嚴格的規則,而在Excel中,任何可以在沒有規則的單元或單元格範圍內編寫任何內容。此外,Access對象庫(tabledefs,querydefs,表單,報告,宏,模塊)與Excel對象庫(工作簿,工作表,範圍,單元格等)有很大不同,所以不存在一對一的轉換在代碼中。

具體而言,對於您的Python項目,請考慮pyodbc使用運行到Excel工作簿的直接連接的生成表查詢。由於MS Access的數據庫是ACE/JET引擎(無論Access安裝在Windows機器上都可以使用Windows的.dll文件)。這個數據存儲的一個特點是能夠連接到工作簿甚至文本文件!所以真的,MSAccess.exe只是一個GUI控制檯來查看.mdb/.accdb文件。

下面創建複製特定的工作簿片的數據的新的數據庫表,假設片材保持:

  1. 表格格式開始在A1細胞(無合併單元/重複標記)在頂行
  2. 頭一致的數據類型格式的
  3. 列(即,數據完整性規則)
(之前或之後或特殊字符 !#$%^~<>))無空格)

Python代碼

import pyodbc 

databasename = 'C:\\Path\\To\\Database\\File.accdb' 

# DSN Connection 
constr = "DSN=MS Access Database;DBQ={0};".format(databasename)  
# DRIVER CONNECTION 
constr = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={0};".format(databasename) 

# CONNECT TO DATABASE AND OPEN CURSOR 
db = pyodbc.connect(constr) 
cur = db.cursor() 

# RUN MAKE-TABLE QUERY FROM EXCEL WORKBOOK SOURCE 
# OLDER EXCEL FORMAT 
sql = "SELECT * INTO [myNewTable]" + \ 
     " FROM [Excel 8.0;HDR=Yes;Database=C:\Path\To\Workbook.xls].[SheetName$];" 

# CURRENT EXCEL FORMAT 
sql = "SELECT * INTO [myNewTable]" + \ 
     " FROM [Excel 12.0 Xml;HDR=Yes;Database=C:\Path\To\Workbook.xlsx].[SheetName$];" 

cursor.execute(sql) 
db.commit() 

cur.close() 
db.close() 
+0

@Parfati謝謝!! :),如果你有時間幫忙,我有一個關於upp的問題,請看編輯 – fili

0

幾乎可以肯定,從上面的芭菲答案是一個更好的方式去,但爲了好玩,我會在下面留下我的答案


如果你願意把我想你需要三樣東西來完成你想要做什麼,自動化時間:

1)發送的數據的字符串表示到Windows剪貼板
還有就是windows的具體代碼,或者你可以節省一些時間和使用pyperclip

2)學習VBA並使用VBA從剪貼板中抓取字符串並處理它。下面是我在Excel中使用過去從剪貼板

Function GetTextFromClipBoard() As String 
    Dim MSForms_DataObject As New MSForms.DataObject 
    MSForms_DataObject.GetFromClipboard 
    GetTextFromClipBoard = MSForms_DataObject.GetText() 
End Function 

3)使用pywin32抓取文本一些示例VBA代碼(我相信可以輕鬆地與蟒蛇)從Python中VBA訪問調用自動化。這可能是最困難的部分,因爲特定的呼叫樹(在我看來)沒有很好的文檔記錄,並且需要大量的戳和挖掘才能確定你需要做什麼。它至少可以說是痛苦的,但是使用IPython來幫助你使用你的pywin32對象可用的方法的視覺線索。

正如我在說明一下上面,我意識到它也有可能跳過剪貼板,只是直接從蟒蛇通過pywin32信息發送給訪問。但是,如果您執行剪貼板路由,則可以打開這些步驟。

  1. 發送一個數據集到剪貼板
  2. 搶和處理數據using the VBA editor in Access
  3. 你找出1和2後,使用pywin32縮小差距

祝你好運,也許寫一篇關於它的博客文章,如果你想出來分享這些細節。