将硬编码的初始化值转换为CSV

2024-09-27 00:18:06 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python,我想将下面显示的数据行从包含硬编码数据的一堆javascript文件中提取到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输出将类似于上述数据的行:

^{pr2}$

我应该使用代码生成工具直接解析上面的语句来获取数据吗?哪种Python方法最有效地将数千个Javascript文件中包含的数据转换为csv表格格式?在

更新:

理想情况下,我希望解决方案将JavaScript语句解析为Python对象,然后将其存储到CSV中,以最大程度地独立于输入脚本代码的排序和格式化


Tags: 文件csv数据falsenewvarhtmlphone
3条回答

如果每个酒店在您的文件中声明了每个字段(即,如果所有酒店的行数相同,即使其中一些是空的),您可以尝试使用一个简单的正则表达式来提取每个由引号(“xxx”)包围的值,然后按数字分组(例如,将每5个字段分组为一行,然后添加换行符)。在

一个简单的正则表达式应该是["'][^"']*["'](EDIT:这是因为我看到一些文件(例如Phone)使用单引号,其余的使用引号)。在

要进行搜索,请使用findall

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

如果这是你必须经常做的事情,并且你想让这个过程完全自动化,我想最简单的方法就是使用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)

请注意,我还没有测试过这段代码,它只是为了帮助您并为您指出正确的方向,它不是完整的解决方案。在

我建议使用正则表达式来选择所有“hotel[#]…”行,然后将所有结果添加到字典中。然后,使用字典,输出到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])

现在有了一个包含属性的酒店字典,该字典按Javascript中的ID分组,以及输出文件“酒店.csv“(标题行和正确转义)。我确实做过一些事情,比如命名组,其实这是不必要的,但我发现这更像是自我评论。在

需要注意的是,如果同一个组在Javascript中提供了两次,比如hotelPhone,那么最后一个组是唯一存储的组。在

在处理这类问题时,这取决于你和你的判断,你需要多大的宽容和卫生设施。您可能需要修改正则表达式来处理不在提供的小示例中的示例(例如,更改捕获组,将匹配限制为行首的示例,等等);或者转义换行字符,如电话号码中的字符);或者去掉某些文本(如电话号码中的“phone:”)。我们没有办法知道这一点,所以记住这一点。在

干杯!在

相关问题 更多 >

    热门问题