将visual foxpro dbf表批量转换为csv

Posted

技术标签:

【中文标题】将visual foxpro dbf表批量转换为csv【英文标题】:Batch convert visual foxpro dbf tables to csv 【发布时间】:2012-02-09 05:07:24 【问题描述】:

我有大量的视觉 foxpro dbf 文件,我想将它们转换为 csv。 (喜欢的可以download some of the data here。点击2011链接获取Transaction Data,准备等很久……)

我可以使用DBF View Plus(一个很棒的免费软件实用程序)打开每个表,但是将它们导出到 csv 每个文件需要几个小时,而且我有几十个文件要处理。

是否有像 DBF View plus 这样的程序可以让我设置一批 dbf 到 csv 的转换以在一夜之间运行?

/Edit: 或者,有没有将 .dbf 文件直接导入 SQL Server 2008 的好方法?它们都应该进入 1 个表,因为每个文件只是同一个表中记录的子集,并且应该具有所有相同的列名。

【问题讨论】:

怎么样:whitetown.com/dbf2csv 您有 Visual Foxpro 可用吗?如果是这样,我可以发布一个您可以运行的简单程序代码...... @DRapp 不幸的是没有。我对VFP也知之甚少。是否免费提供(就像 SQL Express 一样)? 您有哪些编程访问工具... Visual Studio? C#???你知道每个文件有多少条记录吗???大概? 另一位知道谨慎.. 我们也使用过 DBF View 实用程序,不知道它是否相同。但是,如果您在任何系统中使用具有自动递增列的 dbf 以用于 ID 目的,它可能会终止该设置,并且您的应用程序可能会在此之后出现其他问题,因为所有新 ID 都将被创建为零。跨度> 【参考方案1】:

在数组/列表中加载您的 FoxPro 文件列表,然后在每个文件上调用 ConvertDbf 以将它们从 FoxPro 转换为 csv 文件。请参阅下面的 c# 控制台应用程序代码...

感谢 c# datatable to csv 的 DataTableToCSV 函数。

using System;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Text;

namespace SO8843066

    class Program
    
        static void Main(string[] args)
        
            string connectionString = @"Provider=VFPOLEDB.1;Data Source=C:\";
            string dbfToConvert = @"C:\yourdbffile.dbf";
            ConvertDbf(connectionString, dbfToConvert, dbfToConvert.Replace(".dbf", ".csv"));

            Console.WriteLine("End of program execution");
            Console.WriteLine("Press any key to end");
            Console.ReadKey();
        

        static void DataTableToCSV(DataTable dt, string csvFile)
        
            StringBuilder sb = new StringBuilder(); 
            var columnNames = dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName).ToArray(); 
            sb.AppendLine(string.Join(",", columnNames)); 
            foreach (DataRow row in dt.Rows) 
             
                var fields = row.ItemArray.Select(field => field.ToString()).ToArray(); 
                for (int i =0;i < fields.Length;i++)
                
                    sb.Append("\"" + fields[i].Trim() );
                    sb.Append((i != fields.Length - 1) ? "\"," : "\"");
                
                sb.Append("\r\n");
             
            File.WriteAllText(csvFile, sb.ToString());
        

        static void ConvertDbf(string connectionString, string dbfFile, string csvFile)
        
            string sqlSelect = string.Format("SELECT * FROM 0", dbfFile);
            using (OleDbConnection connection = new OleDbConnection(connectionString))
            
                using (OleDbDataAdapter da = new OleDbDataAdapter(sqlSelect, connection))
                
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    DataTableToCSV(ds.Tables[0], csvFile);
                
            
        
    

【讨论】:

【参考方案2】:

在这种情况下,我认为 SQL-Server 具有连接到 foxpro 表的能力。我不完全确定我最近是怎么做到的(上次使用 SQL-Server 大约是 8 年前)。我敢肯定还有其他线程可以指示您将 SQL-Server 连接到 VFP。

我赶紧搜了一下,看到this thread

此外,您可能需要最新的 OleDb 提供程序来建立连接,我也在线程 here 中发布了该连接。此线程还显示了您可能需要来自 SQL-Server 的连接字符串信息示例。数据源信息应指向 .DBF 文件所在的 PATH,而不是您尝试连接的 .DBF 的具体名称。

希望对你有所帮助。

【讨论】:

问题是,我有一个64位版本的SQL server,而FoxPro驱动是32位的,所以我不能让他们一起玩。 @Zach,AAAggggghhhhh...讨厌那个...对不起,我不能再帮忙了。 谢谢你!伙计,这比我最初估计的要困难得多......【参考方案3】:

这很好,感谢您的解决方案。我用它来将一些可视化的 foxpro dbf 表转换为平面文件。使用这些表,转换货币类型的字段存在额外的挑战。 货币字段是一个 64 位(8 字节)有符号整数,位于从第 27 位开始的 36 元素字节数组中。然后将整数除以 1000 得到 4 位小数精度。

如果您有这种类型的字段,请在字段 FOR 循环中尝试此操作

if (("" + fields[i]).Equals("System.Byte[]"))

    StringBuilder db = new StringBuilder();
    byte[] inbytes = new byte[36];
    inbytes = ObjectToByteArray(fields[i]);
    db.Append("" + (double)BitConverter.ToInt64(inbytes,27)/1E4);
    sb.Append("\"" + db);

使用以下辅助方法

private static byte[] ObjectToByteArray(Object obj)
    
        BinaryFormatter bf = new BinaryFormatter();
        using (var ms = new MemoryStream())
        
            bf.Serialize(ms, obj);
            return ms.ToArray();
        
    

【讨论】:

【参考方案4】:

查看my answer 至Foxbase to postrgresql data transfer. (dbf files reader)。

【讨论】:

以上是关于将visual foxpro dbf表批量转换为csv的主要内容,如果未能解决你的问题,请参考以下文章

利用visual foxpro将dbf文件转为excel文件之后 中文部分都是乱码如何解决呢?

使用 ODBC 从 Java 读取 Visual Foxpro 数据

转帖通过PHP读取dbf数据(visual fox pro,VFP数据库),官方的dbase无法读取字段为类型memo的数据,国外网站的解决方案 How to read FoxPro Memo w(代

在 Python 中将 .dbf 批量转换为 .csv

VFP如何将超大数据的EXCEL表转换为DBF表

将 .DBF 文件迁移到 Sql Server 数据库