![]() |
1
2
您不需要推断类型声明!!!! 您可以直接从.dbf文件派生所需的内容。每列都有一个名称、一个类型代码(C=字符,N=数字,D=日期(YYYYMMDD),L=逻辑(T/F),如果文件来自FoxPro,则还有更多类型)、长度(如果相关)和小数位数(对于N类型)。 无论您使用什么软件从.dbf文件中挖掘数据,都需要使用这些信息将每个数据块转换为适当的python数据类型。 字典?为什么?只需做少量的工作,就可以修改该软件,以根据这些列定义生成一个create table语句,并为每一行数据添加一个insert语句。 我假设您使用的是几种已发布的python dbf读取模块之一。它们中的任何一个都应该具有您需要的功能:打开一个.dbf文件,获取列名,获取列类型等信息,获取每一行数据。如果您对所使用的模块不满意,请与我联系;我有一个未发布的模块,就阅读dbfs而言,它结合了其他模块的更好功能,避免了最糟糕的功能,与纯python实现一样快,处理所有Visual FoxPro数据类型和NullFlags伪列,处理memoes,e等。 高温高压 不受欢迎的= 附录: 当我说你不需要推断类型时,你没有说清楚你有一堆C类型的包含数字的字段。 FIPS字段:有些带有前导零,有些没有前导零。如果你要使用它们,你就要面对“012”!='12'!=12问题。我建议去掉前导零,并将它们保存在整型列中,在报表中恢复前导零,如果您真的需要的话,也可以这样做。为什么每个州和县都有两个FIP? 填充:在示例文件中,几乎所有都是整数。四个是40552.0000,一个合理的数字是空的。你似乎认为人口是重要的,并问“有没有可能有一小部分人口字段包含…”?“数据中有任何可能。不要怀疑和猜测,调查!我强烈建议您按照人口顺序对数据进行排序并进行观察;您会发现同一州的多个地方具有相同的人口计数。例如,纽约州有35个地方的人口是8008278,分布在6个县。其中29个的pl_fips值为51000;5个的pl_fips值为5100——看起来像是一个尾随的零问题:-( 决定float和int的提示:try anum=float(chars) 第一 ;如果成功,检查int(anum)=anum。 身份证:很棒的“唯一身份证”;59个案件中,它不是一个int——在加拿大有几个(网站上说“美国城市”;这是一些未解决的边界争端的产物吗?)其中一些包含单词“number”,还有一些是空的。 低垂的果实:我本以为推断人口实际上是整数,比地面高0.1英寸。 这里面有一个严重的缺陷,如果全部([int(value)……逻辑:
显然,您认为您正在测试所有字符串都可以转换为int,但是您添加了附加条件“并且都是非零的”。稍后再浮出几行。 如果只有一个零值,则声明该列不是整数。 即使在修复了这个问题之后,如果只有一个空值,也可以将其称为varchar。 我的建议是:计算有多少是空的(在规范化空白之后(应该包括nbsp))、多少是限定为整数的、多少个非整数非空的是限定为浮点的,以及多少“其他”。检查“其他”项;决定是拒绝还是修复;重复直到满意为止:—) 我希望这些能有所帮助。 |
![]() |
2
5
不要使用eval。如果有人插入了错误的代码,它会破坏数据库或服务器。 而是用这些
其他的都可以是varchar |
![]() |
3
1
您可以通过以下方式确定整数和不安全的浮点数:
一个更安全的方法是执行以下操作
|
![]() |
4
1
感谢您的帮助,这是一个有点长的更新,这里是我如何组合的答案。我从这样的dict列表开始,它是从dbf文件生成的:
然后,函数返回每列1000个值,以测试最佳DB类型声明:
然后你结合了未知和雅各布的方法:varchar是一个很好的默认值,float和int基本上足以满足所有其他条件,
然后将返回的dict格式化为
更新john machin:我使用的是与postgis一起分发的shp2pgsql库。它创建类似下面的模式,其源代码如下 this one :
有些东西一定是错的——FIPS是联邦信息处理标准,它应该是一个介于0和100000之间的整数。人口、海拔等。也许我有更多关于Postgres的特定问题,我不介意丢失少量数据,或将其推到一个表中查找错误或其他内容,同时尝试更改say the population字段的类型。DBF类型检查有多严格?例如,我看到每个shp2pgsql的填充是varchar(12)。有没有可能,人口中的一小部分字段包含“2445 EST”之类的内容?如果我采用我在这个问题中提出的方法,使用前千条记录,我会得到这样的模式:
另一方面,如果我检查all中的每个值(['list'、'of'、'everything'…]),我会得到一个更像第一个的模式。我可以容忍这里的一些数据丢失——如果某个城镇的输入错误,并且它不会显著影响人口数量,等等。
我只使用一个叫
|
![]() |
Terio · Typescript:使用变量的值创建自定义类型 2 年前 |
![]() |
Kareem Adel · 创建函数类型(TypeScript接口) 3 年前 |
![]() |
MatÄj VondráÄek · 如何在c#方法中传递类型? 3 年前 |
![]() |
kreo · 为什么&[T]参数也接受&Vec? 7 年前 |
![]() |
Jiji · 将简单对象强制转换为简单的通用接口 7 年前 |