从 .mdb 字段名称中删除奇怪的字符
Posted
技术标签:
【中文标题】从 .mdb 字段名称中删除奇怪的字符【英文标题】:Remove strange characters from .mdb field names 【发布时间】:2017-12-06 14:34:12 【问题描述】:我有大量 .mdb 文件(如 Microsoft Access db 文件)。第一个字段(或列)应该命名为MyField1
。但是文件已损坏,因此实际字段名称为\ufeffMyField1
,或者换句话说,实际字段名称前有0xFEFF
。
我正在尝试使用 pyodbc-command 将相关字段从 \ufeffMyField1
复制到 NewField
cursor.execute("UPDATE MyTable SET NewField=" + colname + ";")
其中colname
是错误的字段名称(假设NewField
已经存在)
colname
的值是通过 pyodbc 使用类似的方法获取的
rows = cur.columns(table='MyTable')
for row in rows:
if("MyField1" in row.column_name):
colname=row.column_name
执行UPDATE...
命令会产生一个驱动程序错误,即 MaxLocksPerFile Ms Access 参数太低,如此处所述https://support.microsoft.com/en-us/help/815281/-file-sharing-lock-count-exceeded-error-message-during-large-transacti。
但是我在程序中只打开一个文件时将 MaxLocksPerFile 参数增加了几个数量级,所以这似乎不是实际问题。
请注意,我可以毫无问题地在 MS Access 中打开文件并在 gui 中重命名该字段。我还没有找到一种方法可以在 gui 中看到该字段的名称不正确,据说是因为额外的位与常见的编码不匹配。
最后这引出了我的问题:如何将原始字节作为 pyodbc-commands 传递?
或者,如果您有其他方法来解决删除多余字符的实际问题,请在 cmets 中提出建议? (如从字段名称中清除所有非 ASCII 字符)
【问题讨论】:
我会尝试使用 COM 和 DAO 来重命名列。我怀疑这可以通过 SQL 和 ODBC 实现,因为您可能无法通过无效名称引用字段。不过,您可以尝试用括号括起来[ ]
字段名称,以考虑非文本字符,看看是否可以。
我这里没有 .mdb 文件,但是您是否检查过列名的字符串是否出现在文件的原始二进制文件中,以便您可以简单地在那里替换它?跨度>
我已经检查并没有发现它们与字段名称相关联。虽然没有花足够的时间来得出结论
【参考方案1】:
如果你想使用 DAO,那么它非常简单。您可以修改以下代码以查找并循环遍历所有数据库的文件夹。
Sub Rename_First_Field()
Dim dbs As DAO.Database
Dim tdf As DAO.TableDef
Dim fld As DAO.Field
Set dbs = OpenDatabase("C:\....\SomeDB.mdb")
For Each tdf In dbs.TableDefs ' Spin thru all tables in this database
Set fld = tdf.Fields(0) ' Grab the first field
Debug.Print tdf.Name & vbTab & "|" & vbTab & fld.Name
fld.Name = "MyField1" ' Rename to 'MyField1'
Next tdf 'Move to next table
Set tdf = Nothing
Set dbs = Nothing
End Sub
【讨论】:
那不是 python 代码。我的建议是使用 COM 和 PyWin32 从 Python 调用 DAO。当然,使用 VBA 会容易得多。以上是关于从 .mdb 字段名称中删除奇怪的字符的主要内容,如果未能解决你的问题,请参考以下文章