将visual foxpro dbf表批量转换为csv

时间:2012-01-12 22:10:37

标签: csv etl foxpro dbf visual-foxpro

我有大量的visual foxpro dbf文件,我想将其转换为csv。 (如果您愿意,可以download some of the data here。点击2011年的交易数据链接,并准备等待很长时间......)

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

是否有像DBF View plus这样的程序允许我设置一批dbf-to-csv转换以便在一夜之间运行?

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

4 个答案:

答案 0 :(得分:5)

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

DataTableToCSV函数的c# datatable to csv

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);
                }
            }
        }
    }
}

答案 1 :(得分:2)

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

我很快搜索并看到this thread

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

希望这可以帮助你。

答案 2 :(得分:2)

这非常有效并且感谢解决方案。我用它来将一些可视化的foxpro dbf表转换为平面文件。使用这些表格,还有转换Currency类型字段的额外挑战。 货币字段是从第27个位置开始的36个元素字节数组中的64位(8字节)有符号整数。然后将整数除以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();
        }
    }

答案 3 :(得分:1)