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

标签 python parsing csv code-generation

使用 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 输出将类似于上述数据的行:

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

是否应该使用代码生成工具直接解析上述语句来获取数据?将数千个 Javascript 文件中包含的此类数据转换为 csv 表格格式的最有效的 Python 方法是什么?

更新:

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

最佳答案

我建议使用正则表达式来挑选所有“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 分组,以及输出文件“hotels.csv”(带有标题行和正确的转义)。我确实做了诸如命名组之类的事情,这些事情实际上没有必要,但发现它更具 self 评论性。

需要注意的是,如果在 Javascript 中提供了两次相同的组(例如 hotelPhone),则仅存储最后一个组。

在处理此类问题时,取决于您和您的判断,您需要多少宽容和卫生。您可能需要修改正则表达式以处理不提供小样本的示例(即捕获组的更改、将匹配限制为行开头的匹配等);或转义换行符,例如电话号码中的换行符);或删除某些文本(例如电话号码中的“电话:”)。我们没有真正的方法可以知道这一点,所以请记住这一点。

干杯!

关于python - 将硬编码初始化值转换为 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17321783/

相关文章:

python - sympy : check and parse expression from string

c++ - 与 C++ 相比,Vala 是一种理智的解析语言吗?

json - 如何将 Azure Blob 中以 JSON 形式存储的数据加载到 Azure SQL 数据仓库?

python - 在 csv 文件上写入列表时出现类型错误

python - 颜色条打断轴

python - 我在 Databricks 文件存储中使用命令 'dbutils.fs.rm' 删除了一个文件。有办法找回来吗?

java - JJT 文件中的韩文字符集

python - Pandas - 去除空白

python - 如何检查两个线段是否相交?

python - 发布 Jupyter Notebook html 笔记