感謝您的幫助,這是一個更新有點長,這裏是我如何組合的答案。我開始像這樣類型的字典列表,從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