C#使用OleDb导入CSV

时间:2013-08-23 23:14:54

标签: c# parsing csv oledb

我正在尝试设置代码以将.CSV文件导入.NET。

我已经尝试了Microsoft.Jet.OLEDB.4.0Microsoft.ACE.OLEDB.12.0个提供程序,包括修改Extended Properties甚至为每个提供程序修改相应的注册表项。我还没有想出一个我正在尝试做的解决方案:

我想将每个字段导入为文本,但保留长度超过255个字符的字段未截断。

到目前为止,我发现我可以拥有一个或另一个,但不是两个。

  • 如果我将ImportMixedTypes注册表值设置为Majority Type,则会使255个字符的文本字段未被截断,但会将其他字段转换为不需要的类型。
  • 如果我将ImportMixedTypes注册表值设置为Text,则会截断255个以上的字符文本字段,但会将其他字段类型保留为文本。

如何使用OleDb完成此操作?


其他信息:

我有一个“备注”列,可以包含非常冗长的文本。我还有一个“邮政编码”栏,其中包含混合邮政编码格式(5位数字和9位数字,带短划线)。通常,5位数的邮政编码格式更受欢迎,因此导入者认为该列应为整数类型,导入后将9位邮政编码保留为空值。

2 个答案:

答案 0 :(得分:1)

您是否考虑过使用像FileHelpers库(http://filehelpers.sourceforge.net/)这样多功能的东西?

或者,如果您的要求不超过您的要求(阅读csv文件,获取字符串字段),请使用非常简单的内容,例如:

public static class SimpleCsvImport
{
    public static IEnumerable<List<string>> Import(string csvFileName)
    {
        using (var reader = File.OpenText(csvFileName))
        {
            while (!reader.EndOfStream)
            {
                var fields = reader.ReadLine().Split(new[] { ',' }, StringSplitOptions.None).Select(f => f.Trim()).ToList();
                if (fields.Count > 0)
                    yield return fields;
            }
        }
    }
}

答案 1 :(得分:0)

我已经实现了这段代码来读取备忘录字段(Microsoft Access):

  private string GetMemoField(string TableName, string FieldName, string IdentityFieldName, string IdentityFieldValue, OleDbConnection conn)
    {
        string ret = "";

        OleDbCommand cmd1 = new OleDbCommand("SELECT " + FieldName + " FROM “ + TableName + “ WHERE " + IdentityFieldName + "=" + IdentityFieldValue, conn);

                var reader = cmd1.ExecuteReader(System.Data.CommandBehavior.SequentialAccess);  // Create the DataReader that will get the memo field one buffer at a time

        if (reader.Read())
        {
            long numberOfChars = reader.GetChars(/*Field pos*/ 0, 0, null, 0, 0);   // Total number of memo field's chars

            if (numberOfChars > 0)
            {
                int bufferSize = 1024;
                char[] totalBuffer = new char[64*bufferSize];    // Array to hold memo field content

                long dataIndex = 0;

                do
                {

                    char[] buffer = new char[bufferSize];   // Buffer to hold single read
                    long numberOfCharsReaded = reader.GetChars(0, dataIndex, buffer, 0, bufferSize);

                    if (numberOfCharsReaded == 0)
                    {
                        ret = new string(totalBuffer,0, (int)numberOfChars);
                        break;
                    }

                    Array.Copy(buffer, 0, totalBuffer, dataIndex, numberOfCharsReaded);     // Add temporary buffer to main buffer
                    dataIndex += numberOfCharsReaded;

                } while (true);
            }
        }

        return ret;
    }