【问题标题】:APPEND FROM excel sheet gives strange errorAPPEND FROM excel sheet给出了奇怪的错误
【发布时间】:2014-08-29 15:05:49
【问题描述】:

我在 Visual FoxPro 中的 APPEND FROM 语句有问题。如果没有收到此错误,我无法从 excel 表中执行附加操作:

缺少函数名(

我正在处理一些存储在 FoxPro 数据库中的遗留数据。我正在阅读它,在 .NET 中对其进行处理,然后将其写回到一个新的 FoxPro 数据库中。但是,写作部分不起作用。不幸的是,不能选择使用另一个数据库。是的,我是 FoxPro 新手。

我确实可以使用 INSERT 语句,但是如果我可以从外部文件中获取 APPEND 也可以正常工作,并且还能够对备注字段进行水合,那将会很有用。 Afaik 你不能在 FoxPro 中使用 CSV 文件,只有 Excel 和其他一些格式 - 但不是 CSV。

为了演示这个问题,我使用了 Visual Foxpro 附带的通讯簿示例数据库。

我在 V.FP 的查询窗口中运行这个查询:

USE "ADDRESS BOOK!ADDRESSES"
APPEND FROM D:\tmp\excel_data2.xls FIELDS (addressid, firstname) DELIMITED XLS

.xls 文件是 Excel 97-2003 工作簿,如下所示:

A   | B
------------------------
23  | Sample 1
------------------------
24  | Sample 2 

根据这个文档,我认为语法应该是正确的:http://msdn.microsoft.com/en-us/library/aa977271(v=vs.71).aspx

但是,运行此查询只会给我有关“缺少函数名称 (”) 的错误。我已经尝试了我能想到的该查询的各种重写和变体,但我就是不知道是什么问题是。任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 你试过不带括号的字段列表吗?错误说:通常在左括号之前有一个函数名。
  • 不仅不需要括号,还应该去掉“DELIMITED”这个词。
  • 感谢您的提示,我明天上班时会试试这个!
  • 好东西@AxelRichter 和@LAK!我终于让它工作了:-)

标签: excel visual-foxpro


【解决方案1】:

不是为了抢戏,但我就是这样工作的:

确保 XLS 文件以 Excel 5.0/95 格式存储(基本上是一种古老的 Excel 格式,但对于数据输入来说绰绰有余)。

关闭 Excel 文件,否则您将收到有关文件被锁定/在另一个应用程序中打开的错误。

我使用了以下修改后的 APPEND FROM 语句并且它起作用了:

USE "ADDRESS BOOK!ADDRESSES"
APPEND FROM D:\tmp\excel_data2.xls FIELDS addressid, firstname XLS

【讨论】:

  • 您可能最好使用 Excel ODBC 驱动程序,即 Microsoft Office 连接 SDK,它可以让您将工作簿视为数据库,对它运行 SELECT 语句等,并且适用于所有Excel 文件格式。
  • 我明白了,但是我可以通过 .NET 应用程序以编程方式控制事物吗?我需要对 foxpro 数据进行一些自动操作,尽可能少的人工交互。
  • 绝对 - 它是一个 32 位 ODBC/OLEDB 驱动程序,例如:c-sharp-tutorials-4-0.blogspot.ie/2012/05/…
【解决方案2】:

LAK 是正确的,但我会为您的应用以及未来可能遇到的 Excel 导入问题进行澄清。如果您的表格与 Excel 中的列顺序不匹配,您可能会遇到问题。通常我会导入一个知道字段顺序和格式的游标。然后我会追加。一旦进入表的游标版本,我就可以追加到任何其他表、循环遍历它、进行数据清理等。

假设您的地址表具有 ID、LastName、FirstName、Address 的结构...但是您的 Excel 文件将 ID、FirstName+LastName 作为单个字段、Address 并且您知道您需要将其解析为正确的 first/最后一个字段。这将是使用临时游标的一个很好的例子。如果光标的列数比 Excel 多,它们只会顺其自然并为空白,但可以根据需要使用。

create cursor C_TmpFromExcel;
   ( IDCol     int,;
     FullName  c(40),;
     Address   c(35),;
     FirstName c(20),;
     LastName  c(20) )

append from D:\tmp\excel_data2.xls type xls

*/ VERY BASIC example to split the name
replace all lastname with left( fullname, at("," , FullName ) -1 )
replace all firstname with substr( fullname, at( ",", FullName ) +1 )

select LiveAddressTable
append from C_TmpFromExcel

当将一个表(或游标)与另一个表(或光标)一起附加时,VFP 将处理相同列名的匹配,并忽略那些列是额外的且不需要的列(例如示例“FullName”列 - vs提取为额外的名字)。

【讨论】:

  • 这是一个很好的技巧,但有点超出了我的问题。但是感谢您的提示!
猜你喜欢
  • 1970-01-01
  • 2015-07-15
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多