这是一个使用pyparsing
. 如果这对您不起作用,请告诉我 - 想出只使用标准库(例如re
等)的东西应该不会太难,但它肯定会更丑陋。
import csv
from pyparsing import Group, Literal, OneOrMore, Optional, Word
from pyparsing import delimitedList
from pyparsing import alphas, nums
data = """
"POLYGON ((12 13,22 23,16 17,22 24))",101,Something,100000
"POLYGON ((10 12,40 42,46 34,16 24,88 22,33 24,18 20 ))",102,another,200000
"""
def parse_line(line):
latitude = Word(nums)
longitude = Word(nums)
point = Group(latitude + longitude)
point_sequence = delimitedList(point, delim=',')
name = Word("POLYGON").suppress()
paren_left = Literal("((").suppress()
paren_right = Literal("))").suppress()
quote = Literal('"').suppress()
polygon = Group(quote + name + paren_left + point_sequence + paren_right + quote)
uid = Word(nums)
county = Word(alphas)
population = Word(nums)
sep = Literal(",").suppress()
parser = polygon + sep + uid + sep + county + sep + population
result = parser.parseString(line)
return result
def parse_lines(data, outfile):
with open(outfile, 'w') as f:
writer = csv.writer(f, lineterminator='\n')
lines = data.split('\n')
for line in lines:
if not line:
continue
points, uid, county, population = parse_line(line)
for lat, long in points:
writer.writerow([uid, county, population, lat, long])
writer.writerow('')
parse_lines(data, r'd:\out.txt') # change the path to wherever you want output
结果:
101,Something,100000,12,13
101,Something,100000,22,23
101,Something,100000,16,17
101,Something,100000,22,24
102,another,200000,10,12
102,another,200000,40,42
102,another,200000,46,34
102,another,200000,16,24
102,another,200000,88,22
102,another,200000,33,24
102,another,200000,18,20