作为我在C#中工作的项目的一部分,我需要读取.dbf文件.我想要做的第一件事是从文件中获取架构表.只要文件名(没有扩展名)不超过8个字符,我的代码就可以正常工作.
例如,假设我有一个名为MyLongFilename.dbf的文件.以下代码不起作用; 它抛出以下异常:"Microsoft Jet数据库引擎找不到对象'MyLongFilename'.确保对象存在,并正确拼写其名称和路径名称."
string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongFilename;Extended Properties=dBASE 5.0";
OleDbConnection connection = new OleDbConnection(cxn);
Run Code Online (Sandbox Code Playgroud)
要通过此异常,下一步是使用OldDbConnection喜欢的名称('MyLongF~1'而不是'MyLongFilename'),这导致:
string cxn = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyLongF~1;Extended Properties=dBASE 5.0";
OleDbConnection connection = new OleDbConnection(cxn);
Run Code Online (Sandbox Code Playgroud)
这确实成功返回了OleDbConnection.现在要获取模式表,我尝试以下方法:
connection.Open();
DataTable schemaTable = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,
new object[] { null, null, fileNameNoExt, null });
Run Code Online (Sandbox Code Playgroud)
这将返回没有行的DataTable.如果我将文件名重命名为8个或更少的字符,那么此代码可以工作,我会为数据库中的每个字段返回一行.
使用长文件名,我知道返回的连接是有效的,因为我可以使用它来填充DataSet,如下所示:
string selectQuery = "SELECT * FROM [MyLongF~1#DBF];";
OleDbCommand command = new OleDbCommand(selectQuery, connection);
connection.Open();
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = command;
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet);
Run Code Online (Sandbox Code Playgroud)
这使我返回一个包含DataTable的DataSet,其中包含dbf文件中的所有数据.
所以问题是如何才能获得长命名dbf文件的模式表?当然,我可以通过重命名/复制文件来解决这个问题,但这是一个我不想做的黑客攻击.我也不想用前1个记录填充DataSet并从列中推断出架构.
我通过Matlab Central搜索和搜索,但找不到任何方法直接在Matlab中打开DBF文件.TMW File Exchange中有一些DBFREAD函数的引用,但它不再可用.这真的是个问题吗?
我有数据库工具箱,但在那里找不到dbf支持.
我不想使用Excel或其他工具来转换Matlab以外的文件,因为我有很多要处理的文件.ODBC也不好,我需要代码在Mac和Unix下工作.
请帮忙.
我使用VFPOLEDB驱动程序读取DBF文件,我不断收到此错误,我不知道为什么以及如何解决问题:
提供程序无法确定Decimal值.例如,刚刚创建了行,Decimal列的默认值不可用,并且消费者尚未设置新的Decimal值.
这是代码.我调用此例程来返回DBF文件的DataSet并在DataGridView中显示数据.
public DataSet GetDBFData(FileInfo fi, string tbl)
{
using (OleDbConnection conn = new OleDbConnection(
@"Provider=VFPOLEDB.1;Data Source=" + fi.DirectoryName + ";"))
{
conn.Open();
string command = "SELECT * FROM " + tbl;
OleDbDataAdapter da = new OleDbDataAdapter(command, conn);
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
}
Run Code Online (Sandbox Code Playgroud) 我在cp1250中编码了dbf数据库,我正在使用以下代码读取此数据库:
import csv
from dbfpy import dbf
import os
import sys
filename = sys.argv[1]
if filename.endswith('.dbf'):
print "Converting %s to csv" % filename
csv_fn = filename[:-4]+ ".csv"
with open(csv_fn,'wb') as csvfile:
in_db = dbf.Dbf(filename)
out_csv = csv.writer(csvfile)
names = []
for field in in_db.header.fields:
names.append(field.name)
#out_csv.writerow(names)
for rec in in_db:
out_csv.writerow(rec.fieldData)
in_db.close()
print "Done..."
else:
print "Filename does not end with .dbf"
Run Code Online (Sandbox Code Playgroud)
问题是,最终的csv文件是错误的.该文件的编码是ANSI,并且某些字符已损坏.我想问你,如果你能帮我怎样正确读取dbf文件.
编辑1
我尝试了来自https://pypi.python.org/pypi/simpledbf/0.2.4的不同代码,有一些错误.
来源2:
from simpledbf import Dbf5
import os
import sys
dbf = Dbf5('test.dbf', codec='cp1250'); …Run Code Online (Sandbox Code Playgroud) 我有一个相当大的 DBF 文件,大约 40 兆,我需要能够查询它。现在我正在读取 DBF(它只是表格文本)到 h2 数据库中并查询 h2 数据库。这可行,但看起来……很愚蠢。我一直在寻找 DBF 的 4 类 JDBC 驱动程序,但没有找到任何运气。执行此操作的正确方法是什么?
如何.dbf使用 SQL 脚本将文件导入 SQL Server?
从这篇文章中找到了答案,但不幸的是,没有一个对我有用:(:
当我尝试此代码时:
SELECT *
INTO [APP_DB]..[BILLHEAD]
FROM OPENROWSET('MSDASQL', 'Driver=Microsoft Visual FoxPro Driver; SourceDB=D:\DBF; SourceType=DBF', 'SELECT * FROM BILLHEAD')
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
链接服务器“(空)”的 OLE DB 提供程序“MSDASQL”返回消息“[Microsoft][ODBC 驱动程序管理器] 未找到数据源名称且未指定默认驱动程序”。消息 7303,级别 16,状态 1,第 1 行无法初始化链接服务器“(空)”的 OLE DB 访问接口“MSDASQL”的数据源对象。
而且,在尝试此操作时:
SELECT *
FROM openrowset('VFPOLEDB','D:\DBF\BILLHEAD.dbf';'';
'','SELECT * FROM BILLHEAD')
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
消息 7438,级别 16,状态 1,第 1 行
无法在 64 位 SQL Server 上加载 32 位 OLE DB 提供程序“VFPOLEDB”。 …
我不知道为什么我无法使用带有“Flat Tiles (CSV/DBF)”内置 JDBC 驱动程序的 DBeaver 连接到 .DBF 文件。
我有一个共享驱动器,上面有数十个 DBF 文件。我创建了如附图所示的连接,但是当我连接到源时,我遇到了两个问题。我已经包含了我遵循的步骤以及我收到的错误。
有没有人有使用 JDBC 连接到 DBF 文件和/或使用 DBeaver 工具的经验,这可能对我有帮助?
我确实从 GitHub 下载了 DANS-DBF 库 JAR,但我不确定在这种情况下如何使用它。我注意到这个网站上写着
CsvJdbc 需要 Java 版本 1.6 或更高版本。要读取 DBF 文件,必须下载 DANS DBF 库并将其包含在 CLASSPATH 中。
但我不确定如何将其添加到 DBeaver 项目中。它们不像实际的 java 项目那样使用构建路径。
(我知道我可以在excel中打开它们,但我更喜欢这个工具来进行数据查询)。
驱动程序属性只有 .CSV 我尝试使用此设置,当它不起作用时,我将其更改为 .dbf 但它仍然不起作用

我可以很好地连接到这个文件夹,并且我知道其中有大量的 DBF 文件。

我想使用 Python 3.7 上的 dbfread 模块处理 dbf 文件,它适用于小型 dbf
\n\nfrom dbfread import DBF\nfrom struct import *\n\ntable = DBF(\'usuarios.dbf\', load=True)\nfor item in table:\n print (item)\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\nOrderedDict([(\'NUMUSER\', \' 0\'), (\'NOMUSER\', \'Rosy\'), (\'PASSWORD\', \'\'), (\'NIVEL\', \'SUPER\'), (\'VALIDAR\', \'P?@qMw\xc3\xa1\xc2\xbf|Ew}"Q-JW0Q0:iw^\'), (\'EMAIL\', \'MARLENGURROLA@gmail.com|\'), (\'MAILTIPO\', 1), (\'MAILFIRMA\', None), (\'MAILSMTP\', \'Ghf2U*wT3Ik?D#>W0@+9@," \xc2\xa1.deZ+%\xc2\xbfi?GL0oBrO+\xc3\xa9Z=KwXw{E(LXIv#\xc3\xb1O\xc3\xb1\xc3\xb1W+t"Aru\xc3\xa9\xc3\xb1Am\\\\O>YB$iTNv*\\\'\xc3\x91\xc3\xa92).*qv#88XZ5k%KK%R}~\xc2\xa1oOgiT\xc3\xb3\\\'=#\'), (\'HUELLA1\', None), (\'HUELLA2\', None), (\'METODO\', 0), (\'ACTIVO\', True)])\n[Finished in 0.2s]\nRun Code Online (Sandbox Code Playgroud)\n\n但是当我尝试使用大 dbf 时,它显示错误
\n\nfrom dbfread import DBF\nfrom struct import *\n\ntable = DBF(\'docum.dbf\', load=True)\nfor item in table:\n print (item)\nRun Code Online (Sandbox Code Playgroud)\n\n输出2: …
我正在尝试打开几个 DBF 文件并将其转换为数据框。其中大多数工作正常,但对于其中一个文件,我收到错误:“UnicodeDecodeError:‘utf-8’编解码器无法解码位置 15 中的字节 0xf6:无效的起始字节”
我在其他一些主题上读过此错误,例如打开 csv 和 xlsx 以及其他文件。建议的解决方案是包含encoding = 'utf-8'
在读取文件部分。不幸的是,我还没有找到 DBF 文件的解决方案,而且我对 DBF 文件的了解非常有限。
到目前为止我已经尝试过:
1)
from dbfread import DBF
dbf = DBF('file.DBF')
dbf = pd.DataFrame(dbf)
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 8: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)
2)
from simpledbf import Dbf5
dbf = Dbf5('file.DBF')
dbf = dbf.to_dataframe()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf6 in position 15: invalid start byte
Run Code Online (Sandbox Code Playgroud)
3)
# this block of code copied from https://gist.github.com/ryan-hill/f90b1c68f60d12baea81
import pysal …Run Code Online (Sandbox Code Playgroud) 我的项目中出现此错误代码。
奇怪的是,我今天早些时候使用的这段代码运行得很好。但是,由于我安装了 RI 更新,现在在运行它时收到此消息。
df1 <- df %>% select(Month, Longitude, Latitude, Type)
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘select’ for signature ‘"spec_tbl_df"’
Run Code Online (Sandbox Code Playgroud)
该代码仅用于创建仅包含选定列的新数据框。
任何帮助将不胜感激!