2013-06-26 60 views
1

使用Python我想提取從一堆的包含硬編碼數據JavaScript文件下方到csv文件中所示的數據行,如下所示:變換硬編碼初始化值到CSV

 

....html code.... 

hotels[0] = new hotelData(); 
hotels[0].hotelName = "MANHATTAN"; 
hotels[0].hotelPhone = ""; 
hotels[0].hotelSalesPhone = ""; 
hotels[0].hotelPhone = 'Phone: 888-350-6432
'; hotels[0].hotelStreet = "787 11TH AVENUE"; hotels[0].hotelCity = "NEW YORK"; hotels[0].hotelState = "NY"; hotels[0].hotelZip = "10019"; hotels[0].hotelId = "51543"; hotels[0].hotelLat = "40.7686";; hotels[0].hotelLong = "-73.992645";; hotels[1] = new hotelData(); hotels[1].hotelName = "KOEPPEL"; hotels[1].hotelPhone = ""; hotels[1].hotelSalesPhone = ""; hotels[1].hotelPhone = 'Phone: 718-721-9100
'; hotels[1].hotelStreet = "57-01 NORTHERN BLVD."; hotels[1].hotelCity = "WOODSIDE"; hotels[1].hotelState = "NY"; hotels[1].hotelZip = "11377"; hotels[1].hotelId = "51582"; hotels[1].hotelLat = "40.75362";; hotels[1].hotelLong = "-73.90366";; var mykey = "AlvQ9gNhp7oNuvjhkalD4OWVs_9LvGHg0ZLG9cWwRdAUbsy-ZIW1N9uVSU0V4X-8"; var map = null; var pins = null; var i = null; var boxes = new Array(); var currentBox = null; var mapOptions = { credentials: mykey, enableSearchLogo: false, showMapTypeSelector: false, enableClickableLogo: false } .....html code .....

因此所需的CSV輸出就像上面的數據行一樣:

 
MANHATTAN,,,Phone: 888-350-6432 ... 
KOEPPEL,,,Phone: 718-721-9100 ... 

我應該使用代碼生成工具直接解析上述語句來獲取數據嗎?將成千上萬個Javascript文件中包含的數據轉換爲csv表格格式的最有效的Python方法是哪一種?

更新:

理想我想解決解析JavaScript語句爲Python對象,然後存儲它以CSV從訂貨和輸入腳本代碼的格式獲得最大的獨立

回答

0

如果這是你必須做的事情,你想讓這個過程完全自動化,我認爲最簡單的方法就是使用Python解析文件,然後使用csv Python module寫入csv。

你的代碼可能看起來有點像這樣:

with open("datafile.txt") as f: 
    hotel_data = [] 
    for line in f: 
     # Let's make sure the line not empty 
     if line: 
      if "new hotelData();" in line: 
       if hotel_data: 
        write_to_csv(hotel_data) 
        hotel_data = [] 
     else: 
      # Data, still has ending quote and semi colon 
      data = line.split("= ")[1] 
      # Remove ending quote and semi colon 
      data = data[:-2] 
      hotel_data.append(data) 

def write_to_csv(hotel_data): 
    with open('hotels.csv', 'wb') as csvfile: 
     spamwriter = csv.writer(csvfile, delimiter=',', 
           quotechar='""', quoting=csv.QUOTE_MINIMAL) 

     spamwriter.writerow(hotel_data) 

要注意的是我還沒有測試此代碼,它只是爲了幫助你,你指出正確的方向,它不是完整的解決方案。

+0

感謝您的建議,但我想解析這些聲明以獲得最大獨立性,如問題更新中所建議的。 – stackit

0

如果每家酒店在您的文件中聲明(即如果所有的酒店都行相同數額,即使他們中的一些是空的)各個領域,你可能會嘗試使用一個簡單的正則表達式來提取每個值用引號(「xxx」)括起來,然後按編號對它們進行分組(例如,將每5個字段組合成一行,然後添加換行符)。

一個簡單的正則表達式可以工作將是["'][^"']*["'](編輯:這是因爲我看到一些文件(即電話)使用單引號,其餘使用引號)。

爲了使搜索,使用findall

compPattern = re.compile(pattern) 
results = compPattern.findall(compPattern) 
1

我推薦使用正則表達式來挑選出所有行,然後添加所有的結果「酒店[#] ...。」到字典。然後,用字典輸出到CSV文件。下面應該工作:

import re 
import csv 


src_text = your_javascript_text 
p = re.compile(r'hotels\[(?P<hotelid>\d+)\].(?P<attr>\w+) = ("|\')(?P<attr_val>.*?)("|\');', re.DOTALL) 

hotels = {} 
fieldnames = [] 
for result in [m.groupdict() for m in p.finditer(src_text)]: 
    if int(result['hotelid']) not in hotels: 
     hotels[int(result['hotelid'])] = {} 
    if result['attr'] not in fieldnames: 
     fieldnames.append(result['attr']) 

    hotels[int(result['hotelid'])][result['attr']] = result['attr_val'] 

output = open('hotels.csv','wb') 
csv_writer = csv.DictWriter(output, delimiter=',', fieldnames=fieldnames, quoting=csv.QUOTE_ALL) 
csv_writer.writerow(dict((f,f) for f in fieldnames)) 
for hotel in hotels.items(): 
    csv_writer.writerow(hotel[1]) 

現在你酒店的字典W /屬性,通過在JavaScript中的ID,以及輸出文件「hotels.csv」分組(以標題行&正確轉義) 。我確實做過類似命名的組合,但這些組合並不是必需的,但是發現它更加自我評論。

應當注意的是,如果在JavaScript是提供同組的兩倍,像hotelPhone,最後是存儲在唯一的一個。

當這種類型的處理問題,它屬於你和你的判斷,你有多少寬容和衛生需要。您可能需要修改正則表達式來處理不包含小樣本提供的示例(即,捕獲組中的更改,將匹配限制爲行開始處的匹配等)。);或者換掉換行符,就像電話號碼中的那些);或者去掉某些文本(例如電話號碼中的「電話:」)。沒有真正的方法讓我們知道這一點,所以記住這一點。

乾杯!

+0

+1:正確使用正則表達式和groupdict – stackit

+0

re.DOTALL的好例子 – stackit