感谢您的帮助,这是一个更新有点长,这里是我如何组合的答案。我开始像这样类型的字典列表,从DBF文件生成:
dbf_list = [{'Warngentyp': '', 'Lon': '-81.67170', 'Zwatch_war': '0', 'State':...
然后返回每列1000点的值来测试最佳DB类型声明函数:{'column_name':['list', 'of', 'sample', 'values'], 'col2':['1','2','3','4'...
这样的:
def sample_fields(dicts_, number=1000): #dicts_ would be dbf_list from above
sample = dict([[item, []] for item in dicts_[1]])
for dict_ in dicts_[:number]:
for col_ in dict_:
sample[col_].append(dict_[col_])
return sample
然后你结合的未知和雅各的做法:VARCHAR是一个很好的默认和花车和整数基本上够一切,all
是明确的和快速的:
def find_typedefs(sample_dict): #arg is output of previous function
defs_ = {}
for key in sample_dict:
defs_[key] = 'varchar(255)'
try:
if all([int(value) for value in sample_dict[key]]):
defs_[key] = 'int'
except:
try:
if all([float(value) for value in sample_dict[key]]):
defs_[key] = 'float'
except:
continue
return defs_
然后将返回的字典格式化为create table
语句,迭代原始大列表中的值并将它们输入到数据库中。它工作得很好,我现在跳过了中级的sqlite步骤,再次感谢。
John Machin更新:我正在使用随PostGIS分发的shp2pgsql库。它创建的模式就像下面像this one来源:
Column | Type |
------------+-----------------------+-
gid | integer |
st_fips | character varying(7) |
sfips | character varying(5) |
county_fip | character varying(12) |
cfips | character varying(6) |
pl_fips | character varying(7) |
id | character varying(7) |
elevation | character varying(11) |
pop_1990 | integer |
population | character varying(12) |
name | character varying(32) |
st | character varying(12) |
state | character varying(16) |
warngenlev | character varying(13) |
warngentyp | character varying(13) |
watch_warn | character varying(14) |
zwatch_war | bigint |
prog_disc | bigint |
zprog_disc | bigint |
comboflag | bigint |
land_water | character varying(13) |
recnum | integer |
lon | numeric |
lat | numeric |
the_geom | geometry |
有东西,那里有是错误的 - FIPS是联邦信息处理标准,它应该像100000 0和东西之间的整数。人口,海拔等也许我有更多的postgres特定问题,我不介意丢失少量数据,或将它推入表格以查找错误或其他内容,同时尝试更改人口字段中的类型。 dbf类型检查有多严格?例如,我看到每个shp2pgsql的人口是varchar(12)。是否可能有一小部分人口领域包含“2,445 Est。”之类的东西?如果我把我阐述了在这个问题上,与第一千个记录的方法,我得到一个架构是这样的:
Column | Type |
------------+------------------------+-
warngentyp | character varying(255) |
lon | double precision |
zwatch_war | character varying(255) |
state | character varying(255) |
recnum | character varying(255) |
pop_1990 | integer |
land_water | character varying(255) |
elevation | integer |
prog_disc | integer |
comboflag | character varying(255) |
sfips | integer |
zprog_disc | integer |
pl_fips | integer |
county_fip | integer |
population | integer |
watch_warn | integer |
name | character varying(255) |
st | character varying(255) |
lat | double precision |
st_fips | integer |
cfips | integer |
id | integer |
warngenlev | integer |
在另一方面,如果我在所有([“名单”检查每一个值, '','所有'...]),我得到的模式更像第一个。我可以容忍这里的一些数据丢失 - 如果某个城镇的入口是错误的,并且不会显着影响人口数字等。
我只使用一个名为dbview
的旧包来管道dbf文件到这些脚本 - 我不想映射任何格式的本地功能。我认为shp2pgsql在这方面会取得低下的成果。对于dbview或其他软件包的任何建议都是值得欢迎的 - 尽管在其他情况下我可能没有使用dbf文件,并且无论如何都需要找到最好的类型。我也会问一个关于postgresql的问题,看看我能否在该级别找到解决方案。
我也不认为eval是不安全的(在我的情况下),这是一个很好的答案。我可能会有管理员上传数据,因此在某些假设中可能存在风险,但我没有规定不可靠的数据。 – unmounted 2009-06-06 06:16:23